- 한국지능정보사회진흥원(이하 NIA)의 관리자 페이지 및 관리자 계정 노출 - NIA에서 관리하던 행정안전부, 외교부 등 주요 정부부처의 소스코드 파일이 유출
내용
- 한국지능정보사회진흥원 > 우리나라 AI 및 정보화 전문기관
- 정보보안 조직을 갖추고 있음에도 방화벽 설정 미흡 > 방화벽 포트가 열려 있었고, 이를 통해 외교부, 행안부 등의 소스코드 파일이 유출 > 집에서 사용하는 직원의 개인 PC가 악성코드에 감염된 것이 확인
- 외부에 노출된 NIA의 웹페이지는 총 9개 > 문제가 된 것은 프로덕트 관리자 페이지 > 해당 페이지의 계정정보가 산출물 시스템과 연결돼 외교부, 행안부 등 주요 정부부처의 소스코드 파일이 유출 > 정부부처의 정보화 및 IT 관련 사업을 맡고 있어 유출된 소스코드 파일과 규모를 파악하는 것이 시급
- 현재 유출 사고의 원인을 확인하고, 현재 보호조치에 대한 보완이 필요하며, 유출된 소프트웨어 소스코드나 소프트웨어 관련 정보가 공격자에 의해 악용되지 않도록 하는 추가 조치가 필요
기타
- 누구나 접근할 수 있도록 방화벽 포트를 열어놨느냐는 것이 심각한 문제
- NIST, 안전한 소프트웨어 개발 프레임워크 > 4가지 안전한 수명주기 전반의 지침을 제공 ① 소프트웨어 개발 보안 조직 준비 ② 소프트웨어 보호 ③ 안전한 소프트웨어 제작 ④ 소프트웨어의 잠재적 취약성 대응 > 개발된 소프트웨어가 변경 또는 무단으로 접근되는 것을 방지하기 위해 기술적·관리적·물리적 보호 조치를 통해 보호되도록 요구
- 개인 또는 기업이 별도의 하드웨어나 서비스 구비 없이 로컬에서 LLM을 구동할 수 있게 해 주는 오픈소스 애플리케이션
2. 주요내용
- 인터넷에 노출된 Ollama 프레임워크에서 6개의 보안 취약점이 발견 [2] > 익스플로잇에 성공할 경우 DDoS, 인공지능 모델 감염, 인공지능 모델 탈취가 가능
> 4개의 취약점에 대한 보안 업데이트 발표
> 2개의 취약점은 Ollama 유지보수 팀이 취약점으로 인정하지 않아 CVE 번호가 할당되지 않음
※ CVE가 할당되지 않은 2개의 취약점은 패치 또한 제공되지 않음 : 엔드포인트를 노출시키지 않는것이 기본이며, 이 기본이 지켜지지 않는다는 가정 하에 연구된 취약점이므로 취약점으로 볼 수 없다는 입장
2.1 CVE-2024-39720
- 취약한 버전 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 파일을 생성해 서버에 업로드
- 공격자는 잘못된 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
- 취약한 버전 Ollama에서 발생하는 파일 존재 여부 공개 취약점
> /api/push 엔드포인트를 존재하지 않는 경로 매개변수를 통해 호출할 때 발생
> 이스케이프된 URI를 공격자에게 응답으로 반환 > 이로 인해 서버에 존재하는 파일 및 디렉터리 정보가 노출되어, 공격자가 추가로 시스템을 탐색 또는 악용할 수 있음
영향받는 버전: Ollama <= 0.1.45
2.3 CVE-2024-39719
- 취약한 버전 Ollama에서 발생하는 파일 존재 여부 공개 취약점
영향받는 버전: Ollama 0.3.14
- /api/create 엔드포인트를 존재하지 않는 경로 매개변수를 통해 호출하여응답(오류)을 통해존재 유무 확인
구분
설명
파일이 존재하지 않는 경우
요청 : ~/ 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
- 취약한 버전 Ollama에서 발생하는 서비스 거부 취약점
영향받는 버전: Ollama <= 0.1.33
- CreateModelHandler 함수는 os.Open을 사용하여 완료될 때까지 파일을 읽음
> req.Path 사용자 지정 매개변수를 사용하며, /dev/random으로 설정할 수 있음
> 매개변수 값이 /dev/random일 경우 난수를 생성할 엔트로피를 모을 때까지 차단이 발생
> 해당 파일을 열고 읽기 시도한 고루틴은 엔트로피가 충분히 쌓이기를 기다리면서 계속 차단
> 클라이언트가 요청을 취소해도 고루틴은 멈추지 않고 무한히 실행
2.5 모델 중독 (CWE-668)
- 기본 설정을 사용하는 Ollama 서버의 경우 /api/pull 경로에 대한 인증 절차가 없음
> 즉, 누구나 인증 없이 해당 API를 호출 가능한 상태
> 공격자는 클라이언트가 자신이 제어하는 서버에서 악의적인 모델을 다운로드하도록 유도할 수 있음
> 해당 API를 지속적으로 호출하여 디스크가 가득 찰 때까지 모델을 다운로드하게 되어 서비스 거부로 이어질 수 있음
2.6 모델 도용 (CWE-285)
-기본 설정을 사용하는 Ollama 서버의 경우 /api/push 경로에 대한 인증 절차가 없음
- 친러 해킹그룹, 한국 기관 대상 DDoS 공격 및 데이터 유출 시도 - 외부 접속 단속하고, 계정·백업·이메일 등 철저한 관리 권고
내용
- 친러시아 해커 그룹, 한국 금융권 및 공공기관을 겨냥한 DDoS 공격과 데이터 유출 시도 > 한국이 우크라이나를 지원했다는 빌미
- 사이버 위협정보 분석·공유 시스템 ‘C-TAS(Cyber Threat Analysis & Sharing)’ 보안 공지 3건 발표 > 기관과 기업의 적극 협조 요청 ① 외부 접속 관리 강화 > 기업 자산 중 외부에 오픈된 DB 서비스, NAS 등 시스템 현황을 파악 > 테스트 서버 등 불필요한 시스템 연결을 차단 > 중요 시스템 접속자의 경우 개인 단말에 임의로 원격제어 프로그램이 설치됐는지 확인 > 불필요한 네트워크 서비스를 중지 및 1433, 3389 등 기본 서비스 포트 사용 지양 > 부득이하게 외부에서 접속해야 하는 경우 접속 IP 및 단말기기 제한, 다중인증 설정이나 내부차단을 위한 서버별 접근제어 설정·확인 > 해외 및 야간이나 주말 접속 IP와 비정상 접속 여부, 일반적이지 않은 네트워크 통신량에 대한 주기적인 로그 확인 필요
② 계정 관리 강화 > 기본 관리자 패스워드를 사용하고 있다면 반드시 변경 > 사용하지 않는 기본 관리자 계정은 비활성화 및 권한 제외 > 정기적 비밀번호 변경과 2차 인증수단을 적용
③ 백업 관리 강화 > 중요 자료는 네트워크와 분리된 별도의 저장소에 정기적으로 백업 > 외부 클라우드 등에 자료 보관과 소유 기반의 이중인증 적용 권고 > 클라우드 자체에 대한 랜섬웨어 감염을 대비해 클라우드에 보관된 자료의 정기적 백업
④ 이메일 보안 강화 > 이메일 송신자 및 메일 주소 확인 > 불분명한 메일 및 첨부파일, URL 클릭을 지양 > 첨부파일의 경우 확장자 확인 > 바로가기 파일이나 실행 파일 클릭 지양 > 파일 탐색기 > 보기 > '파일 확장명’ 체크 상태 확인 > 파일 탐색기 > 보기 > 옵션 > 폴더 및 검색 옵션 변경 > 보기 > 알려진 파일 형식의 파일 확장명 숨기기 체크 해제 상태 확인 > 이메일 보안 솔루션을 사용해 유해성 유무 확인 및 악성 이메일을 차단
⑤ 기타 > 홈페이지와 주요 시스템에 대한 모니터링 강화 > 자동 업데이트를 통해 운영체제 및 SW를 최신 상태 유지 > 바이러스 백신 프로그램을 설치 및 최신 상태 유지 > 랜섬웨어 감염에 대비한 복구 계획 수립 및 모의훈련 수행 요구
기타
- 침해사고를 당했을 경우 > 한국인터넷진흥원인터넷침해대응센터 종합상황실(02-405-4911~5) > KISA 인터넷보호나라&KrCERT 홈페이지를 통해 신고
- ’EmeraldWhale(에메랄드웨일)’, 노출된 Git 설정 파일 스캔해 클라우드 계정 인증 정보 탈취 - IP 범위를 자동화된 툴로 스캔해 .git/config나 .env 등 민감한 정보를 포함할 가능성이 있는 설정 파일 탐색
내용
- ’EmeraldWhale(에메랄드웨일)’ > 깃허브(GitHub), 깃랩(GitLab), 비트버킷(BitBucket) 등 주요 코드 저장소 타깃으로 해당 파일에서 API 키나 인증 토큰을 확보 > 이를 통해 추가로 저장소에 접근해 클라우드 서비스 및 이메일 서비스 인증 정보를 더 많이 확보하는 방식으로 진행 > 탈취된 인증 정보는 아마존 S3 버킷에 보관한 후 피싱, 스팸 캠페인에 사용되거나 사이버 범죄자들에게 직접 판매
- httpx와 Masscan 같은 오픈소스 도구를 사용 > 전 세계의 IP 주소 리스트를 42억 개에 이르는 파일로 준비해 약 5억 개의 IP 주소를 스캔 > 유효한 토큰을 찾으면 curl 명령어를 사용해 클라우드 API에 검증 > 접근이 가능할 경우 해당 저장소를 다운로드해 클라우드 서비스와 이메일 플랫폼의 인증 정보를 추출 > 이메일 서비스의 인증 정보는 대규모 스팸 및 피싱 공격에 활용
- 친러 성향 해커 서버 킬러스, 텔레그램을 통해 국내 CCTV 해킹 주장 - CCTV IP와 비밀번호 일부 모자이크 공개 및 30달러 요구
내용
- 09.23 서버 킬러스(SERVER KILLERS), 텔레그램에 국내 CCTV 해킹 주장 > 서울, 인천, 대전, 수원 지역 CCTV 100대 해킹 주장 > PC방, 사무실, 길거리, 계단, 주차장 등 공용 공간 영상 > 09.22~09.23 경 촬영된 영상
- 모자이크 처리된 CCTV IP와 비밀번호 공개 및 30달러 요구 > 샘플로 공개한 자료에 CCTV IP와 평문 접속정보가 포함 > 보안이 취약한 ID/PW를 사용하는 CCTV를 찾아 접속한 것으로 추정 > 가급적 인터넷 연결 차단, ID/PW 강화, 보안 패치 적용 등 필요
기타
- 국내 다수의 CCTV가 여전히 해킹 위험에 노출 > CCTV 침해 사건 대부분의 경우 초기 패스워드 사용 및 누구나 접근 가능한 설정이 원인 > CCTV 해킹 방지 방안은 다각도로 고려돼야 할 필요 > 비밀번호 변경, 접근 제어, 암호화 전송 등 조치 필요
- 대상 모델의 출력을 활용하여 모델이 안전 장치를 우회하도록 유도하여 탈옥하는 멀티-턴 공격 > 목표 달성을 위한 기초가 될 수 있는 질문으로 공격 시작 > 관련된 무해한 주제로 시작하여 점진적으로 질문을 강화하여 모델의 응답을 의도한 결과로 유도 > 따라서 사용자의 프롬프트에 반응하도록 설계된 방어 및 안전 조치를 우회
- 모델의 내부 작동 방식을 파악할 필요가 없음 > 사용자가 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]
- 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]
- 악의적인 키워드를 무해한 키워드로 교체하여 악성 의도를 숨기는 방식으로 LLM의 안전 장치를 우회 > 공격 단계 : 키워드 추출-컨텍스트 생성-공격 > 키워드 추출 : 전처리 단계에서 악성 키워드 필터링 및 추출 > 컨텍스트 생성 : 악의적인 키워드를 무해한 키워드로 대체하여 새로운 문장 생성 > 공격 : 새롭게 생성된 콘텍스트를 이용해 LLM의 안전 장치 우회
- 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
- Windows Scripting Engine에서 발생하는 Type Confusion 취약점으로 메모리 손상을 유발해 원격 명령 실행을 가능하게 함 > jscript9.dll에서 발생하는 Type Confusion 취약점
※ Type Confusion 취약점 : 프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화되었을 때와 다른 타입으로 사용할 때 발생하는 취약점
스텁코드는 Type Confusion 문제가 발생할 수 있음 - 매개변수로 정수형 변수를 입력받는 함수가 있으며, 메인에서 100번 호출된다고 가정 > 엔진에서는 Hot으로 간주하여 정수형 변수를 전달받는 스텁코드로 변환 > 그 결과, 해당 변수의 데이터 유형을 정수로 예측 > 이 때, 매개변수를 정수가 아닌 다른 데이터 유형으로 전달할 경우 Type Confusion 발생
2.2 상세분석
- 해커는 국내 광고 대행사 중 한 업체의 광고 서버를 해킹 > Toast 광고 프로그램에 전달되는 HTML 코드에 iframe을 삽입하여 경유지를 통해 JavaScript가 로드 되도록 변조 > 해당 JavaScript 파일명은 ad_toast이며 IE(JScript9.dll)의 RCE 취약점이 발현되는 코드가 삽입 > 피해자 PC에 설치된 Toast 광고 프로그램은 취약점 코드를 받아 랜더링하는 과정에서 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의 패치를 우회
- 해당 취약점은 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 등의 보안 업데이트를 준수하고, 제조사들은 제품 개발 시 보안에 취약한 개발 라이브러리 및 모듈 등이 사용되지 않도록 주의 필요