- 스타링크(Starlink)를 탑재한 스바루 차량들에서 심각한 보안 취약점 발견 [1] - 공격에 성공하면 미국, 캐나다, 일본에 있는 모든 스바루 차량과 고객 계정에 무제한 접근이 가능 - 이메일 주소, 전화번호, 차량번호판 중 하나만 알아도 최소 네 가지 공격을 진행할 수 있음
※ 현재는 보안 패치가 적용된 상태
2. 주요 내용
- 사용자가 차량에 명령을 보낼 수 있는 MySubaru 모바일 앱을 분석 > 프록시 처리한 후 명령을 가로채고 승인 없이 차량의 잠금을 해제할 수 있는지 찾기 위함 > 그러나, 앱의 보안 상태와 인증 시스템 모두 보안이 정상적으로 작동
2.1 portal.prod.subarucs.com
- 일반적으로 자동차 제조사들은 고객용 앱보다 더 광범위한 권한을 가진 직원용 앱이 있으며, subarucs.com이 이에 해당함 - 도메인에 대한 스캔을 실행한 결과 하위 도메인 hxxps://portal.prod.subarucs.com/login.html을 발견 > 해당 도메인에는 ‘스타링크 관리자 포털’(STARLINK Admin Portal)'이라는 이름이 붙어 있었음 > 구글링 결과 STARLINK는 스바루 차량 내 인포테인먼트 시스템의 이름으로 차량의 모든 원격 제어 기능을 담당
※ 인포테인먼트 (Infotainment) : 정보(Information)와 오락(Entertainment)의 합성어로, 정보 전달에 오락성을 가미한 소프트웨어를 지칭하는 용어
[사진 1] portal.prod.subarucs.com
2.2 /assets/_js/
- 해당 페이지의 소스를 확인해 아래 부분을 확인
> "/assets/_js/" 폴더 아래에 몇 가지 흥미로운 JavaScript 파일이 있었기 때문에, 다른 JavaScript 파일을 찾기 위해 디렉토리를 무차별 대입
[사진 2] /assets/_js/
2.3 login.js
- FFuF를 실행한 후 흥미로운 코드가 있는 login.js 파일을 확인 > 확인 토큰 없이 직원의 계정을 재설정할 수 있는 "ResetPassword.json" 엔드포인트가 있는 것으로 확인
[사진 3] ResetPassword.json
2.4 /forgotPassword/resetPassword.json
- 임의의 계정 정보를 포함한 POST 요청을 전송
[사진 4] 임의의 계정 정보 전송 및 실패
- 유효한 계정 정보를 사용해 테스트한 결과 비밀번호를 정상적으로 변경할 수 있었음
[사진 5] 유효한 계정 정보 전송및 성공
2.5 2FA 우회
- 변경한 계정 정보를 통해 로그인을 시도한 결과 2FA 인증이 필요
[사진 6] 2FA 요구
- UI에서 클라이언트 측 오버레이를 제거하는 간단한 방법으로 2FA 인증을 우회할 수 있었음
> 또한 모든 버튼이 정상적으로 작동
[사진 7] 오버레이 제거[사진 8] 2FA 우회
2.6 차량 해킹
- 지인의 차량 번호판을 통해 관리자 패널에서 접근 권한을 부여 > 계정이 성공적으로 생성되었음을 확인할 수 있는 이메일을 수신 > 생성된 계정으로 지인 차량의 잠금을 원격에서 해제할 수 있었음
본 게시글은 DeepSeek 논문과 구글링 결과 및 개인적인 생각를 정리한 글로, 정확하지 않을 수 있습니다. 혹여 잘못된 내용이 있다면, 알려주시면 감사하겠습니다.
1. 개요
- 중국 AI 스타트업이 개발한 오픈소스 기반의 LLM, DeepSeek - GPT-4와 유사한 수준의 성능을 제공하면서도, 훨씬 적은 자원으로 훈련 - 주로 자연어 처리와 생성 AI 모델에 특화된 기술을 제공 - 기술 혁신과 AI 기조를 파괴하였으나, 보안과 관련된 주요 문제점이 대두
2. DeepSeek 주요 기술
- 기존 AI 서비스를 개발하고 배포 및 운영하는 데에는 많은 비용과 시간, 공간이 필요 > OpenAI, Anthropic 등의 기업들은 계산에만 1억 달러 이상을 소비 > 또한, 계산을 위한 수 천대의 GPU가 필요하며, 이를 위한 대규모 데이터 센터를 운용
- 그러나, DeepSeek은 GPT-4 개발 비용의 약 1/17 수준에 불과한 약 600달러로 개발
① FP8 Mixed Precision Training
- 일반적으로 신경망의 크기가 커질수록 성능이 향상되나, 메모리와 컴퓨팅에 대한 문제가 발생 > 혼합 정밀도 훈련 (Mixed Precision Training)은 모델의 정확도와 파라미터에 영향을 끼치지 않고, 메모리 요구사항을 줄이고 GPU 산출 속도를 높일 수 있는 신경망 훈련 방법 > 혼합 정밀도 훈련은 모델 학습 과정에서 부동 소수점(Floating-Point Numbers) 연산 정밀도를 혼합하여 사용하며, 주로 FP16, FP32를 혼합하여 사용함 > 숫자가 높을수록 모델의 정확도가 높아지나, 메모리를 많이 사용하는 단점을 지님
[사진 1] Floating Point Format
- DeepSeek에서는 FP8이라는 저비트 연산 체계를 도입하여 연산 효율성과 메모리 사용 효율을 극대화
[사진 2] FP8 Mixed Precision Training
* NVDIA 연구를 통해 FP8은 FP16 대비 2배 높은 성능을 제공하고, 2배 낮은 메모리 사용량을 가지는 것이 확인
[사진 3] FP16과 FP8의 정확도 비교
② DeepSeek MoE (Mixture of Experts)
- MoE (Mixture of Experts)란 게이팅 네트워크를 통해 각각의 입력에 가장 관련성이 높은 전문가 모델을 선택하는 방식으로 여러 전문가 모델 간에 작업을 분할
> 게이팅 네트워크 (Gating Network)란 입력 데이터에 따라 다른 전문가 (Expert) 모델을 동적으로 선택하는 역할을 하는 신경망
> 입력은 라우터를 사용해 적절한 각 전문가 모델로 전달되어 처리되며, 데이터를 효율적으로 처리할 수 있음 > 일반적으로 기존 MoE는 8~16개의 전문가를 두고 특정 토큰이 특정 전문가로 라우팅 되도록 하지만, 하나의 전문가가 다양한 토큰을 처리하게 됨 > 또한 서로 다른 전문가들이 같은 지식을 학습하는 지식 중복의 문제가 발생
- DeepSeek은 2 가지를 활용해 MoE의 성능을 개선
⒜ Fine-grained Expert Segmentation (세분화된 전문가 모델 분류)
- 각전문가를 더 작고, 더 집중된 기능을 하는 부분들로 세분화하여 하나의 전문가가 보다 세분화된 특정 영역의 지식을 집중적으로 학습하도록 유도
⒝ Shared Expert Isolation (공유 전문가의 분리)
- 여러 작업에 필요한 공통 지식을 처리할 수 있는 공유 전문가를 분리 및 항상 활성화시켜 공통 지식을 처리하도록 하여 지식 중복을 줄이고, 각 전문가들은 고유하고 특화된 영역에 집중할 수 있음
[사진 4] DeepSeek MoE
- 또한, 기존 MoE에서는 특정 전문가에게 토큰이 몰려 학습 및 추론에서 성능상 문제가 생기는 것을 방지 하기위해 Auxiliary Loss(부가 손실)를 추가로 도입해 로드 밸런싱 > 부가 손실을 추가하여 균형을 맞출 수 있으나, 각 모델의 성능을 저하시킬 위험이 있음
- DeepSeek MoE에서는 Aux-Loss-Free Strategy (부하 균형)를 활용해 이러한 문제를 해결 > 각 전문가마다 Bias를 두고 과부하/과소부하 상태를 모니터링해 해당 값을 감소/증가 시킴
[사진 5] Bias 계산
> 부하 균형이 개별 시퀀스 내에서 부하 불균형이 발생할 수 있어, 시퀀스 단위에서 부하 균형을 유지하기 위한 추가적인 보조 손실을 도입 (Complementary Sequence-Wise Auxiliary Loss, 보조 시퀀스 손실) > 기존 MoE에서 특정 전문가에게 과부하가 걸리는 현상을 해결 하기위해 하나의 전문가가 담당하는 토큰 수를 제한하여 부하를 분산 (Node-Limited Routing, 노드 제한 라우팅) > 기존 MoE에서 토큰을 균등하게 분배하지 못하는 경우 부하를 줄이기 위해 초과된 토큰을 Drop하는 방식을 사용하였으나, 정보 손실과 모델 품질을 하락 시키기 때문에, 모든 입력 토큰을 반드시 처리하도록 보장 (No Token-Dropping, 토큰 드롭 없음)
- MoE 모델의 효율성을 높이고, 성능 저하 없이 안정적인 추론이 가능하며, 기존 MoE 모델보다계산 자원을 효율적을 사용하고 높은 품질의 결과를 제공
③ Multi-Head Latent Attention (MLA)
- Attention : 입력 데이터의 중요한 부분에 가중치를 부여하여 모델이 더 집중할 수 있도록 하는 메커니즘으로, 어떤 정보가 더 중요한지를 학습하여 가중치를 동적으로 조절 - Self-Attention : 주어진 입력 내의 각 단어나 토큰이 다른 단어와 얼마나 관련되어 있는지를 계산하는 메커니즘으로, 각 단어는 다른 모든 단어에 대한 가중치를 부여해 중요성과 문맥을 파악 - Multi-Head Attention : 하나의 Self-Attention을 여러 헤드로 나누어 동시에 수행하는 방식으로, 모델이 입력 데이터를 여러 각도에서 분석할 수 있게 하여, 정보를 더 풍부하게 처리 > Query(Q : 현재 처리하고 있는 단어나 시퀀스 부분), Key(K : 비교 대상인 다른 단어나 시퀀스 부분), Value(V : 최종적으로 가중치를 적용 받는 단어나 시퀀스 부분) 행렬을 각각 생성 > 기존 Multi-Head Attention에서는 모든 헤드별로 Key, Value를 그대로 저장해 활용함 > 따라서, 모델 규모가 커질수록 Key-Value Cache에 대한 메모리 사용량이 급증해 연산 속도를 저하시킴
- DeepSeek에서는 Multi-Head Latent Attention(MLA)를 도입하여 Key-Value 데이터를 압축해 더 적은 메모리로도 동일한 성능을 유지하도록 설계됨
[사진 6] MLA
④ Multi-Token Prediction (MTP)
- Multi-Token Prediction (MTP)란 다음 여러 토큰을 순차적으로 예측하여 생성 속도를 향상시키고 학습 신호를 풍부하게 함 > t 시점에 t+1, t+2, t+3…을 예측하여 데이터에서 얻을 수 있는 신호가 더 촘촘해져 더 나은 정확도를 달성
[사진 7] MTP
⑤ 기타
- 각 토큰마다 활성화되는 파라미터를 370억 개로 제한하여 계산 효율성을 높이면서도, 높은 성능을 유지 - 학습을 통해 128,000자까지 문맥을 확장해 긴 문서나 대화를 자연스럽게 처리할 수 있도록 함
3. DeepSeek 보안 논쟁
① OpenSource 공급망 공격
- DeepSeek는 오픈소스로 배포되고 있기 때문에 공급망 공격의 대상이 될 가능성이 높음
> 개발의 효율성을 높이기 위해 오픈소스를 자주 활용하나, 오픈소스 소프트웨어는 공급망 공격에 취약 > 악성코드를 삽입하거나, 악성코드를 포함한 유사한 이름의 패키지를 업로드 하는 등의 방법으로 공격을 진행
사례
설명
XZ Utils 백도어 사건
- XZ Utils는 리눅스 시스템에서 널리 사용되는 오픈소스 압축 라이브러리 - 공격자는 프로젝트에 개발자로 참여하여 수 년간 신뢰를 쌓아 권한을 획득하고, 악성코드를 포함한 버전을 저장소에 커밋
PyPI 타이포스쿼팅 공격
- PyPI (Python Package Index)는 파이썬 패키지를 제공하는 오픈소스 패키지 저장소 - 공격자들은 인기 있는 라이브러리와 유사한 이름을 지닌 패키지를 배포하여 사용자가 실수, 오타 등으로 악성 패키지를 다운로드하도록 유도
event-stream 공격 사건
- 원 제작자에게 event-stream 프로젝트 관리를 대신해 주겠다고한 요청이 승인되어 관리를 시작한 공격자가 비트코인을 훔치는 악성 코드를 삽입해 배포
DeepSeek 사칭 악성 패키지
- 이미 PyPI에 DeepSeek의 인기에 편승해 이를 사칭한 악성 패키지를 유포하여 222명이 피해를 당한 사실이 확인 - DeepSeek 관련 개발 도구로 위장한 패키지를 업로드하였으며, 인포스틸러로 동작함
② 중국 소프트웨어 정보 탈취 문제
- 중국에서 개발된 소프트웨어 및 하드웨어에서 정보 탈취, 백도어가 포함되어 있다는 의심과 실 사례 존재
사례
설명
육군 악성코드가 포함된 중국 CCTV 사용
- 육군이 해안과 강변 경계 강화를 위해 설치한 모든 CCTV 215대 에서 중국 서버에 정보를 전송하도록 설계된 악성코드가 발견 - 악성코드를 심은 후 납품한 것으로 확인되었으며, 백도어를 통해 악성코드를 유포하는 사이트로 연결
중국 소프트웨어 백도어 논란
- 다른 기업에 스파이를 파견하거나 기술을 훔쳐내는 등 부정한 방법으로 성장한 기업과 중국 정부의 연관성 대한 의심으로 논란이 시작 - 미국, 유럽, 일본, 호주 등 세계 각지에서 이동통신 네트워크에서 중국 소프트웨어의 사용을 금지하였으며 단계적으로 퇴출 시작
중국 정부의 데이터 접근 권한 논란
- 중국은 국가정보법을 통해 자국 기업이 보유한 데이터를 요청할 수 있는 권한을 지니므로, 관련 데이터가 중국 정부에 의해 활용될 가능성이 있음
중국 드론 제조업체의 사용자 데이터 원격 서버 전송 문제
- 미국 국토안보부는 중국 드론을 사용할 때 각종 위치정보, 음성정보 등이 원격 서버로 전송된다는 의혹을 제기
중국 스파이칩 문제
- 중국에서 좁쌀 크기의 해킹용 칩을 제작 및 서버 기판에 내장하여 20개 업체에 판매된 후 보안 실사 과정에서 해킹 정황이 발견된 사건
③ 중국 소프트웨어 사용 금지 움직임
- 미국 FCC는 ‘국가 안보 위협 중국 통신장비 및 영상감시장비 승인 금지’를 발표해 통신장비, CCTV, IoT, 해저케이블 등에서 중국 기업의 장비와 서비스 사용을 금지하였으며, 기존에 설치한 장비와 서비스는 제거 - 미국, 유럽 등 여러 국가에서 틱톡이 사용자의 데이터를 중국으로 전송할 가능성이 있다는 점이 우려되어 틱톡 사용 금지 조치가 시행되거나 논의되고 있는 중 - 인도에서는 틱톡을 포함한 59개 중국 앱이 금지되었으며, 미국에서는 공무원 및 정부 기관에서 사용하는 기기에 틱톡 사용을 금지하는 법안이 통과
- 미국 의회, 해군, NASA, 펜타곤, 텍사스 주 정부 등도 딥시크 앱의 사용을 금지
- 호주, 이탈리아, 네덜란드, 대만, 한국 등 여러 국가에서도 정부 기기에서의 앱 사용을 금지하는 조치 > 국내에서는 환경부, 보건복지부, 여성가족부, 경찰청 등의 정부 부처와 현대차, 기아, 모비스 등의 기업에서 DeepSeek를 접속할 수 없도록 차단
④ DeepSeek 자체 보안 문제
- DeepSeek 자체적으로도 보안 문제가 보고된 사례가 있음
구분
설명
서비스 관련
- 사이버 공격으로 신규 가입이 불가했었던 시점이 존재 - 민감한 질문에(정치, 역사 등) 언어별로 다르게 답변 - 광범위한 개인정보 수집과 수집된 데이터가 중국 서버에 저장 > 광고주 등과 제한 없는 사용자 정보공유 > 사용자의 모든 정보가 학습데이터로 유입 및 활용 > 중국의 국가정보법에 근거 중국 정부에 의해 사용될 수 있음
민감정보 외부 노출
- DeepSeek 데이터베이스가 외부에 공개되어 접근이 가능한 상태로 발견 > 데이터 열람만이 아니라 각종 제어 행위도 가능 > 100만 줄이 넘는 로그에 내부 테이터와 채팅 기록, 비밀 키 등 각종 민감 정보가 포함
민감정보 탈취
- 이용자 기기 정보와 키보드 입력 패턴 등을 수집해 중국 내 서버에 저장하는 것이 확인 - iOS 앱은 민감한 사용자 및 기기 정보를 암호화 없이 인터넷으로 전송하는 것이 확인 > 중간자 공격, 스니핑 등 해킹 기법에 쉽게 노출 > 애플의 앱 전송 보안(App Transport Security, ATS) 기능을 비활성화한 상태로 운영 > 하드코딩된 암호화 키와 초기화 벡터(initialization vector)의 재사용
부정 사용
- 탈옥 방법이 공개 - DeepSeek-R1에 대한 안전성(Safety) 및 보안성(Security) 평가를 실시 > Jailbreaking(탈옥) 공격 성공률 63% > 역할극(Role-Playing) 기반 공격 성공률 83% > 허위 정보(Misinformation) 생성 위험도 89% > JSON 기반의 구조화된 입력(Structure Converting)을 활용한 공격 성공률 82% > 악성 코드 생성(Malware-gen) 요청 프롬프트 78% 성공률 > 사이버 보안(Cyber Security) 관련 취약성 54.6% > 한국어 기반 공격에서 평균적으로 18% 더 높은 취약성
⑤ 기타
- 생성형 AI 서비스의 올바르지 못한 사용 > 개인정보, 민감정보 등이 포함된 파일을 업로드하여 사용하는 경우가 있음 > 생성형 AI 도구들의 입력 데이터를 분석한 결과 전체 입력 데이터 중 8.5%가 민감정보를 포함 > 탈옥으로 보안 조치를 우회해 악성코드, 피싱메일, 공격 툴 등을 생성해 악용
4. 시사점
① 경제성 측면
- DeepSeek의 가장 큰 장점은 경제적 효율성으로 기존 AI 모델 대비 저비용, 고효율 AI 훈련 및 운영이 가능
구분
설명
AI 모델 개발 비용 절감
- DeepSeek은 GPT-4 수준의 성능을 1/17 수준으로 구현 > AI 스타트업 및 중소기업들도 상대적으로 적은 예산으로 대형 AI 모델을 활용할 수 있는 기회를 제공
기업의 AI 도입 문턱을 낮춤
- 고성능 AI 모델을 자체적으로 개발할 여력이 없는 기업에 AI 개발 및 도입에 대한 진입 장벽을 낮춤 > 오픈소스로 제공되기 때문에, 자체적으로 DeepSeek을 커스터마이징하여 활용할 수 있음
AI 산업 경쟁 심화
- 소수 기업이 AI 모델 개발을 독점하는 구조에서 저비용 오픈소스 모델이 등장함에 따라 다양한 국가와 기업의 경쟁 심화
② 보안성 측면
- 경제적 효율성이 뛰어나지만, 보안 리스크가 존재하는 AI 모델로 도입 시 경제성과 보안성 간의 균형을 고려할 필요
구분
설명
개인 및 기업의 대응 전략
개인
- AI 사용 시 민감한 데이터 입력 금지 - 신뢰할 수 있는 AI 도구 사용 검토
기업
- 내부 보안 검토 후 AI 도입 결정 - AI 모델 검증 프로세스 도입 - AI 사용 시 데이터 암호화 및 접근 통제 강화
정부 및 공공기관의 대응 전략
정부
- 중국산 AI 모델의 보안성 평가 강화 - 공공기관 내 AI 모델 도입 시 엄격한 검증 절차 수립 - 자국산 AI 모델 개발 투자 확대
공공기관
- 외부 AI 도구 사용 시 보안 검토 필수 - 중요 정보가 포함된 데이터는 폐쇄망에서만 사용
- 네트워크 및 시스템 성능을 모니터링하는 오픈 소스 도구 > SNMP를 기반으로 네트워크 장비, 서버, 애플리케이션 등의 성능 데이터를 수집하고, RRDTool을 사용하여 그래프 형태로 시각화
※ SNMP (Simple Network Management Protocol) : 네트워크 장비(라우터, 스위치, 서버 등)의 상태 및 성능 데이터를 수집하는 프로토콜 ※ RRDTool : 시간에 따라 변화하는 데이터를 저장하고 그래프로 시각화해주는 툴
2. CVE-2025-22604
[사진 1] CVE-2025-22604 [2]
- Cacti의 다중 라인 SNMP 결과 파서의 결함으로 인해 발생하는 원격 코드 실행 취약점 (CVSS : 9.1) [3]
> OID의 일부가 시스템 명령의 일부로 사용되는 배열의 키로 사용되어 취약점이 발생
OID (Object IDentifier) [4]
- SNMP는 네트워크 장비의 정보(CPU 사용량, 메모리 사용량, 포트 Up/Down 상태 등)을 MIB(Management Infomation Base)에 저장해 정보를 주고받음 -MIB 내에 포함되어 있는 각 개별 정보(Object)에 대한 ID를 OID라 함 - 즉, CPU 사용량, 메모리 사용량, 포트 상태 등 각 정보에 대해 구분할 수 있는 ID
영향받는 버전 : Cacti <= 1.2.8
- ss_net_snmp_disk_io() 또는 ss_net_snmp_disk_bytes()로 처리될 때 각 OID의 일부가 시스템 명령의 일부로 사용되는 배열의 키로 사용되어 취약점이 발생 > cacti_snmp_walk()에서 exec_into_array()를 사용해 명령을 실행하고 여러 줄을 배열로 사용해 결과를 읽음 > 그 후, [사진 2]의 코드를 사용해 문자 = 를 기준으로 왼쪽 값을 OID에, 오른쪽 값을 Value에 저장 > Value의 경우 필터링을 적용하지만, OID 값은 필터링 없이 사용
[사진 2] OID와 Value 분할 코드
$i=0;
foreach($temp_array as $index => $value) { // $temp_array 배열 순회
if(preg_match('/(.*=.*/',$value)) { // $value 값이 "키=값" 형식인 경우
$parts=explode('=',$value,2); // = 문자를 기준으로 $value를 두 부분으로 분할
$snmp_array[$i]['oid']=trim($parts[0]); // 공백을 제거한 후 값을 oid에 저장
$snmp_array[$i]['value']=format_snmp_string($parts[1],false,$value_output_format); // 필터링 후 value에 저장
$i++; // 다음 배열 인덱스로 이동
} else { // 멀티라인 값 처리
$snmp_array[$i-1]['value'].=$value;
}
}
- PlushDaemon으로 명명된 중국 APT 그룹에의해 한국 VPN 공급 업체 IPany는 공급망 공격을 당함 [2] > 공격자들은 합법적인 설치 프로그램에 SlowStepper 백도어를 삽입 > SlowStepper는 C++, Python, Go로 프로그래밍된 약 30개의 모듈로 구성된 대규모 툴킷을 갖추고 있음
- 사용자들은 VPN 다운로드 URL (hxxps://ipany[.]kr/download/IPanyVPNsetup.zip)에서 악성 파일을 다운 > 악성 IPanyVPNsetup.exe 설치 프로그램이 실행되면 여러 디렉토리를 생성하고, 정상 및 악성 파일을 모두 배포
[사진 1] 정상 및 악성 파일 배포
- 공격 체인
순서
설명
IPanyVPNSetup.exe 실행
- AutoMsg.dll 로드 - 레지스트리를 등록해 (값 : %PUBLIC%\Documents\WPSDocuments\WPSManager\svcghost.exe) 부팅 시 악성 구성 요소 svcghost.exe가 실행되도록 함
IPanyVPNSetup.exe가 ExitProcess를 호출할 때 셸 코드로 실행 리다이렉션
- 셸 코드 : EncMgr.pkg를 메모리에 로드 및 실행
- EncMgr.pkg > %PUBLIC%\Documents에 2개의 디렉터리를 생성 (WPSDocuments, WPSManager)하고 NetNative.pkg, FeatureFlag.pkg에서 구성 요소를 추출 및 실행 > 추출 및 실행 순서
⒡ BootstrapCache.pkg를 Qmea.dat에 복사 > %PUBLIC%\Documents\WPSDocuments\WPSManager\Qmea.dat
⒢ ShellExecute API를 사용하여 svcghost.exe를 실행 및 종료
svcghost.exe
- PerfWatson.exe 프로세스를 모니터링해 실행 중이 아니면 PerfWatson.exe를 실행해 lregdll.dll를 사이드 로드 - lregdll.dll는 winlogin.gif에서 SlowStepper 백도어 로드
[사진 2] 공격 체인 요약
2.1 SlowStepper 백도어
- 합법적인 DNS 서버를 사용해 7051.gsm.360safe[.]company에 대한 TXT 레코드를 획득 > 쿼리는 TXT 레코드의 처음 6바이트가 특정 문자열과 일치하는지 확인하고, 일치할 경우 나머지 문자열(C&C IP 주소를 포함하는 인코딩된 암호화문(base64, AES) 추출
※ TXT 레코드 : 도메인 및 하위 도메인과 관련된 텍스트 정보를 저장하며, 주로 메일이 신뢰할 수 있는 출처에서 온 것인지 확인하는데 사용 (SPF, DKIM, DMARC) [3]
[사진 3] 악성 도메인을 포함한 DNS TXT 레코드
- 획득한 C&C IP로 연결을 시도하며, 실패 시 API를 사용해 대체 C&C IP 획득 > 연결 실패 시 : st.360safe[.]company 도메인에 gethostbyname API를 사용해 해당 도메인에 매핑된 IP 주소를 얻어 대체 C&C 서버로 사용 > 통신이 설정되면 HOST 정보(CPU 정보, 호스트 이름, 실행 중인 프로세스 목록, 설치된 애플리케이션 목록 등), 파일 삭제, 셸 모드 활성화 등의 명령을 처리 > 또한 Python, C/C++, Go 언어로 작성된 모듈을 로드하고 실행하는 기능 포함
※ gethostbyname API : 주어진 도메인 이름을 이용하여 해당 도메인의 IP 주소를 알아내는 데 사용 [4]
- 터널링 프로토콜의 보안 취약점이 발견돼 420만 개 이상의 인터넷에 연결된 호스트가 공격에 노출 [1][2] > 터널링 프로토콜 : 두 네트워크 간에 데이터를 전송할 때, 데이터를 캡슐화하여 다른 네트워크 프로토콜의 데이터 패킷 안에 포함시켜 안전하고 효율적으로 전달할 수 있도록 해주는 네트워크 통신 프로토콜 - VPN 서버, 가정용 라우터, 인터넷 핵심 라우터, 모바일 네트워크 게이트웨이, 콘텐츠 전송 네트워크 노드 등 다양한 호스트가 공격에 취약 - 서비스 거부 공격부터 비인가 네트워크 접근까지 다양한 악성 활동을 가능하게 함
2. 주요내용
- IPIP/IP6IP6, GRE/GRE6, 4in6, 6in4 프로토콜에서 인증과 암호화를 지원하지 않아 외부에서 패킷을 변조 또는 악용할 수 있는 문제가 발견 > 스캐닝 (Standard tunnel, Subnet-spoofing, Spoofing, 6to4 & IPv4-mapped address, Tunneled ICMP Echo/Reply, Tunneled ICMP TTL Expired)을 통해 전체 IPv4 주소공간(37억개)과 1,000만 개의 IPv6 주소를 스캔
[사진 1] 스캔 방법 및 결과 요약
- 스캔 결과 약 430만 개의 취약한 호스트 중 약 190만 개의 호스트가 스푸핑이 가능한 것으로 확인
[사진 2] 터널링 프로토콜 별 취약한 호스트 및 스푸핑 가능한 호스트의 갯수
구분
설명
IPIP (IP-in-IP)
- IPv4 패킷을 또 다른 IPv4 패킷 안에 캡슐화하여 전송 - 구현이 간단하나 암호화와 인증을 제공하지 않음 - 외부 헤더 : 터널링의 시작점(출발지)과 끝점(목적지) 정보 등 - 내부 헤더 : 원래 IPv4 패킷 정보
IP6IP6 (IPv6-in-IPv6)
- IPv6 패킷을 또 다른 IPv6 패킷 안에 캡슐화하여 전송 - IPv6 전용 네트워크 환경에서 최적화되어 있지만, IPv6 인프라가 필요 - 외부 헤더 : 터널링의 시작점(출발지)과 끝점(목적지) 정보 등 - 내부 헤더 : 원래 IPv6 패킷 정보
GRE (Generic Routing Encapsulation)
- IP 패킷뿐만 아니라 다양한 프로토콜을 캡슐화할 수 있음 - 다양한 프로토콜을 캡슐화할 수 있어 여러 목적으로 사용가능하나, 암호화 기능이 없음 - 외부 헤더 : 터널링의 시작점(출발지)과 끝점(목적지) 정보 등 - 내부 헤더 : 원래 패킷 정보
GRE6 (Generic Routing Encapsulation IPv6)
- GRE의 IPv6 버전으로, IPv6 패킷을 캡슐화하거나 GRE 터널을 IPv6 네트워크 상에서 운용 - GRE의 다양성을 유지하면서, IPv6 환경에 최적화되어 있지만, 암호화 기능이 없음 - 외부 헤더 : 터널링의 시작점(출발지)과 끝점(목적지) 정보 등 - 내부 헤더 : 원래 패킷 정보
GUE (Generic UDP Encapsulation)
- UDP 패킷 안에 다양한 프로토콜을 캡슐화하여 전송 - 다양한 프로토콜을 캡슐화 할 수 있으며, UDP를 사용해 단순하고 효율적이나 신뢰성이 부족 - 외부 헤더 : 터널링의 시작점(출발지)과 끝점(목적지) 정보 등 - 내부 헤더 : 원래 패킷 정보
4in6 (IPv4-in-IPv6)
- IPv4 패킷을 IPv6 패킷에 캡슐화하여 전송하며, IPv6 네트워크를 통해 IPv4 트래픽을 전송할 수 있음 - IPv6 네트워크 상에서 IPv4 지원을 용이하게 할 수 있으나, 패킷 크기가 커져 MTU 문제가 발생할 수 있음 - 외부 헤더 : 터널링의 시작점(출발지)과 끝점(목적지) 정보 등 - 내부 헤더 : 원래 IPv4 패킷 정보
6in4 (IPv6-in-IPv4)
- IPv6 패킷을 IPv4 패킷으로 캡슐화하여 전송하며, IPv4 네트워크를 통해 IPv6 트래픽을 전송할 수 있음 - IPv4 전용 네트워크에서 IPv6 지원을 용이하게 할 수 있으나, 터널 끝점이 고정되어 있어야 하며, 보안을 제공하지 않음 - 외부 헤더 : 터널링의 시작점(출발지)과 끝점(목적지) 정보 등 - 내부 헤더 : 원래 IPv6 패킷 정보
[사진 3] 터널링 프로토콜별 상위 3개 포트/도메인
- 공격자는 터널링 헤더를 조작해 접근 제어를 우회하고 서비스 거부 공격 등의 악성 행위를 수행할 수 있음 > 외부 헤더 : 출발지 공격자 IP, 목적지 취약한 호스트 IP > 내부 헤더 : 출발지 취약한 호스트 IP, 목적지 공격 대상 IP > 취약한 호스트가 외부 헤더 중 출발지 IP(=공격자 IP)를 제거하고, 내부 헤더를 확인해 목적지로 전달 > 내부 헤더의 출발지 IP가 신뢰할 수 있는 호스트 IP인 경우 네트워크 필터를 우회할 수 있음
[사진 4] 공격 과정 요약
[영상 1] 공격 설명
- 4개의 CVE가 할당
취약점
영향 받는 프로토콜
CVE-2024-7595 [4]
GRE 및 GRE6
CVE-2024-7596 [5]
GUE
CVE-2025-23018 [6]
IPv4-in-IPv6 및 IPv6-in-IPv6
CVE-2025-23019 [7]
IPv6-in-IPv4
- 대응방안
> 인증 및 암호화 프로토콜(IPsec, WireGuard 등)을 사용해 터널링 트래픽 보호 > 라우터와 미들박스에 트래픽 필터링 구현 > 악의적인 터널링 패킷에 대한 심층 패킷 검사(DPI) > 암호화되지 않은 터널링 패킷 모두 차단
- 대체 경로(Alternate Path) > 시스템이 정상적으로 인증을 요구하는 주요 경로(로그인 페이지 등)를 우회할 수 있는 비표준적인(≒비공식적인) 경로 > 디버깅용 또는 개발 테스트용 백도어가 남아있는 경우 > 사용자 입력 값(URL 매개변수)을 조작해 비인가된 데이터를 조회 > 잘못된 권한 검증으로 특정 파일 또는 디렉토리에 접근
> 대응 : 디버깅 및 테스트 코드 제거, 입력 값 검증, 숨겨진 디렉터리 접근 방지 등
- 대체 채널(Alternate Channel) > 정상적인 인증 프로세스와 보안 채널(HTTPS 등)을 우회하여 비정상적인 통신 채널을 통해 시스템에 접근하거나 데이터를 전송하는 것 > HTTP 요청을 통해 정보 전송 및 평문 가로채기 > 레거시 프로토콜을 통해 암호화되지 않은 정보 가로채기 > 모바일 앱, IoT 기기에서 SSL/TLS 인증서 검증이 불완전해 중간자 공격으로 데이터 탈취
> 대응 : HTTPS 강제 적용, 레거시 프로토콜 비활성화, SSL/TLS 검증 강화, 네트워크 모니터링 및 로그 관리 등
2. CVE-2024-55591
[사진 1] CVE-2024-55591 [2]
- Fortinet 제품의 대체 경로 또는 대체 채널 문제로 인해 발생하는 인증 우회 취약점 (CVSS: 9.8)
> 공격자는 Node.js 웹소켓 모듈에 대한 조작된 요청을 통해 슈퍼 관리자 권한을 얻을 수 있음
※ 취약점 관련 상세 내용 확인 불가
영향받는 제품 - FortiOS 7.0 : 7.0.0 이상 ~ 7.0.16 이하 - FortiProxy : 7.2.0 이상 ~ 7.2.12 이하 / 7.0.0 이상 ~ 7.0.19 이하
- 관련 PoC [3]
> 총 5개의 조건을 충족할 경우 취약 (status_code_1_check, status_code_2_check, body_checks, header_marker_check, connection_upgrade_check)
※ 응답코드 101 : 클라이언트가 보낸 업그레이드 요청 헤더에 대한 응답으로, 서버가 클라이언트의 Upgrade 요청을 받아들여 프로토콜을 변경할 것임을 알림, 주로 WebSocket 프로토콜 전환 시 사용 [4]
body_checks
- 첫 번째 응답에서 세 가지 값 (html_main_app_check, f_icon_warning_check, f_icon_closing_check)의 만족 여부 확인
html_main_app_check = '<html class="main-app">' in first_response.text f_icon_warning_check = '<f-icon class="fa-warning' in first_response.text f_icon_closing_check = '</f-icon>' in first_response.text <중략> body_checks = html_main_app_check and f_icon_warning_check and f_icon_closing_check
header_marker_check
- 첫 번째 응답에서 특정 헤더 (APSCOOKIE_)의 존재 여부 확인
header_marker_check = any('APSCOOKIE_' in str(header) for header in first_response.headers.values())
connection_upgrade_check
- 두 번째 응답에서 Connection 헤더의 값 확인
connection_upgrade_check = 'Upgrade' in second_response.headers.get('Connection', '')
import requests
import random
from uuid import uuid4
from datetime import datetime, timedelta
import argparse
banner = """\
__ ___ ___________
__ _ ______ _/ |__ ____ | |_\\__ ____\\____ _ ________
\\ \\/ \\/ \\__ \\ ___/ ___\\| | \\\\| | / _ \\ \\/ \\/ \\_ __ \\
\\ / / __ \\| | \\ \\\\___| Y | |( <_> \\ / | | \\\n \\/\\_/ (____ |__| \\\\\\\___ |___|__|__ | \\\\__ / \\\/\\_/ |__|
\\\ \\\ \\\
CVE-2024-55591.py
(*) Fortinet FortiOS Authentication Bypass (CVE-2024-55591) vulnerable detection by watchTowr
- Sonny , watchTowr (sonny@watchTowr.com)
- Aliz Hammond, watchTowr (aliz@watchTowr.com)
CVEs: [CVE-2024-55591]
"""
def generate_random_suffix(length=6):
"""Generate a random lowercase suffix."""
return ''.join(random.choice('abcdefghijklmnopqrstuvwxyz') for _ in range(length))
def perform_web_interaction(target, port):
"""
Perform a two-step web interaction with specific parameters.
Args:
target (str): Target IP address
port (int): Target port
Returns:
tuple: Results of the two requests
"""
# Construct base URL
base_url = f"https://{target}:{port}"
# Generate random suffix
random_suffix = generate_random_suffix()
# Disable SSL verification warnings
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)
# First request - login-like endpoint
first_url = f"{base_url}/login?redir=/ng"
first_response = requests.get(first_url, verify=False, timeout=10)
# Second request - endpoint with random suffix
second_url = f"{base_url}/watchTowr-{random_suffix}"
second_headers = {
'Sec-WebSocket-Version': '13',
'Sec-WebSocket-Key': 'thFz/fKwzu5wDEy0XO3fcw==',
'Connection': 'keep-alive, Upgrade',
'Upgrade': 'websocket'
}
second_response = requests.get(second_url, headers=second_headers, verify=False, timeout=10)
return first_response, second_response
def validate_interaction_conditions(first_response, second_response):
"""
Validate specific conditions for the web interaction.
Args:
first_response (requests.Response): First HTTP response
second_response (requests.Response): Second HTTP response
Returns:
bool: Whether all conditions are met
"""
try:
# Check status codes
status_code_1_check = first_response.status_code == 200
status_code_2_check = second_response.status_code == 101
# Check body contents for first response
html_main_app_check = '<html class="main-app">' in first_response.text
f_icon_warning_check = '<f-icon class="fa-warning' in first_response.text
f_icon_closing_check = '</f-icon>' in first_response.text
body_checks = html_main_app_check and f_icon_warning_check and f_icon_closing_check
# Check for specific header marker
header_marker_check = any('APSCOOKIE_' in str(header) for header in first_response.headers.values())
# Check connection upgrade for second response
connection_upgrade_check = 'Upgrade' in second_response.headers.get('Connection', '')
# Print detailed information about first response matchers
if not html_main_app_check:
print("[!] Target is not a FortiOS Management Interface")
exit()
if not f_icon_warning_check:
print("[!] '<f-icon class=\"fa-warning\"' not found in response")
# Combine all checks
return all([
status_code_1_check,
status_code_2_check,
body_checks,
header_marker_check,
connection_upgrade_check
])
except Exception as e:
print(f"[!] Error during validation: {e}")
return False
def main():
"""
Main function to run the web interaction checks.
"""
print(banner)
parser = argparse.ArgumentParser(description='CVE-2024-55591 Detection Tool')
parser.add_argument('--target', '-t', type=str, help='IP address of the target', required=True)
parser.add_argument('--port', '-p', type=int, help='Port of the target', required=False, default=443)
args = parser.parse_args()
try:
print(f"[*] Targeting: https://{args.target}:{args.port}")
first_response, second_response = perform_web_interaction(args.target, args.port)
result = validate_interaction_conditions(first_response, second_response)
if result:
print("[!] VULNERABLE: All conditions were met")
else:
print("[*] NOT VULNERABLE: Conditions were not satisfied")
except requests.RequestException as e:
print(f"[!] Request error: {e}")
except Exception as e:
print(f"[!] Unexpected error: {e}")
if __name__ == "__main__":
main()
3. 대응방안
- 벤더사 제공 보안 업데이트 적용 [5]
제품명
영향받는 버전
해결 버전
FortiOS 7.0
7.0.0 이상 ~ 7.0.16 이하
7.0.17 이상
FortiProxy
7.2.0 이상 ~ 7.2.12 이하
7.2.13 이상
7.0.0 이상 ~ 7.0.19 이하
7.0.20 이상
> Fortinet 권고사항 [6]
구분
설명
로그 점검
- 랜덤 scrip 및 dstip가 포함된 로그인 활동 관련 로그: type="event" subtype="system" level="information" vd="root" logdesc="Admin login successful" sn="1733486785" user="admin" ui="jsconsole" method="jsconsole" srcip=1.1.1.1 dstip=1.1.1.1 action="login" status="success" reason="none" profile="super_admin" msg="Administrator admin logged in successfully from jsconsole"
- 무작위로 생성된 것처럼 보이는 사용자 이름과 소스 IP가 포함된 관리자 생성 로그: type="event" subtype="system" level="information" vd="root" logdesc="Object attribute configured" user="admin" ui="jsconsole(127.0.0.1)" action="Add" cfgtid=1411317760 cfgpath="system.admin" cfgobj="vOcep" cfgattr="password[*]accprofile[super_admin]vdom[root]" msg="Add system.admin vOcep"
- 로그에서 공격자들이 사용한 것으로 나타난 IP 주소: 1.1.1[.]1 127.0.0[.]1 2.2.2[.]2 8.8.8[.]8 8.8.4[.]4
위협행위자 수행 작업 점검
- 임의의 사용자 이름으로 장치에 관리자 계정 생성 - 임의의 사용자 이름으로 장치에 로컬 사용자 계정 생성 - 사용자 그룹 생성 또는 기존 sslvpn 사용자 그룹에 위의 로컬 사용자 추가 - 기타 설정(방화벽 정책, 방화벽 주소 등) 추가/변경 - 위에 추가된 로컬 사용자로 sslvpn에 로그인하여 내부 네트워크로 가는 터널 생성
공격 IP 점검 및 차단
- 45.55.158[.]47 [가장 많이 사용되는 IP 주소] - 87.249.138[.]47 - 155.133.4[.]175 - 37.19.196[.]65 - 149.22.94[.]37
권고
- HTTP/HTTPS 관리 인터페이스 비활성화 - 로컬-인 정책을 통해 관리 인터페이스에 접근할 수 있는 IP 주소를 제한