공부/SPACE

DEF CON 29 Aerospace Village - Fuzzing NASA Core Flight System Software, Ronald Brobert Reproduce

JUNFUTURE 2024. 6. 4. 22:16

NASA의 cFS를 타겟으로 네트워크 퍼저인 fuzzotron을 이용해 퍼징했던

DEF CON의 연구를 reproduce 해본다.

 

아래 링크를 참고하였다.

 

DEF CON 29 Aerospace Village - Fuzzing NASA Core Flight System Software, Ronald Brobert

 

cFS Configuration & Fuzzotron Fuzzing Setting

cFS와 Fuzzotron 세팅은 아래 링크를 참고하면 좋다.

 

https://juntheworld.tistory.com/190

 

cFS 설치 및 실행하는방법

Part1 - Setup아래 깃허브 링크에서 cFS를 git clone 해준다.https://github.com/nasa/cFS GitHub - nasa/cFS: The Core Flight System (cFS)The Core Flight System (cFS). Contribute to nasa/cFS development by creating an account on GitHub.github.comgi

juntheworld.tistory.com

https://juntheworld.tistory.com/192

 

Fuzzotron 을 이용한 NASA cFS(Core Flight System) 퍼징하기

1. 소개Fuzzotron이라는 네트워크 퍼저를 이용해 UDP 패킷을 cFS 프로그램으로 전송하여 퍼징을 진행했다.cFS를 설치하는 것은 아래 링크를 참고하면 좋다.https://juntheworld.tistory.com/190 cFS 설치 및 실행

juntheworld.tistory.com

 

Trigger Segmentation Fault

  • DEFCON 컨퍼런스에서 공개한 인풋을 replay해보았다.
  • 동일하게 segmentation fault가 발생하는 것을 확인했다.
# target cFS program execute
sudo gdb core-cpu1

# after execute, send udp packet
udpreplay ./udp-kill-3236.pcap

DEF CON conference에서 공개한 crash UDP packet

 

CCSDS 패킷 구조 파악

  • 16개의비트 → 4비트 4비트 4비트 4비트
    • 각 16진수 4개로 PacketID / Packet Sequence Control / Packet Length / Packet Data 구성
      NASA의 CCSDS 우주 패킷과 crash가 발생한 패킷매핑

일반 패킷 (정상작동을 유발하는 UDP 패킷)

 

드래그한 주황색 부분(우) 를 바꿔주면, cFS 로그상에서 Len = 부분이 7+주황색 부분 숫자로 변경됨

NASA cFS 상에서의 로그. Len = 부분의 로그가 패킷의 주황색부분 + 3으로 변경됨

 

해당 부분의 Len은 cFS 에서의 ActualLength라는 변수 값에 해당한다.

cFS 소스코드상에서 Len = 의 의미

 

00 01 (default setting)

80 01 (crash)

Err:Msg Too Big 을 확인할 수 있다.

 

  • 결국 패킷상에 이 부분에 대한 처리가 잘못되어 터짐 → 이부분 Length만 2001로 바꿔주고 다른 부분 다 바꿔도 터짐
    • packetID만 valid (0x1801) 하게 주면 segmentation fault 발생

20 01 로 세팅한 뒤 ./replay 전송시 오류가 발생하는 것을 확인할 수 있음

취약점 분석

cFS의 CI 에 존재하는 길이 검증을 우회하게 되면서 추후에 존재하는 memcpy 에서 사용가능한 메모리 영역을 넘어 값을 쓰게 되어 segmentation fault가 발생한다.

 

좀 더 자세하게는 Cl_Lab에서 받은 데이터 바이트와 CCSDS 패킷헤더에 있는 데이터 바이트와 같지않아서 발생하는 문제이다.

SB_SendMsg → CFE_SB_SendMsgFull → memcpy (CFE_SB_SendMsgFull 에서 사용하는 memcpy(cfe_sb_api.c + 1309)
SendMsg -> SendMsgFull 내부에 있는 memcpy에서 segfault 발생

 

NASA cFS 소프트웨어 아키텍처 상에서는 다음과 같은 곳에서 crash가 발생한다.

 

Ground Station → CI_Lab으로 Command를 보냈을때 이를 처리하는 부분에서 발생하고

단순히 CI Lab 에서 처음 입력한 메세지의 길이 값 처리로 인해 발생하는 문제라 cFS의 내부 모듈까지 닿지는 않은 문제이다.

DEFCON 29 Impact, Mitigations, Reporting 해석

결론적으로 본 취약점은 NASA에 제보되었으나 반려당했고 그 이유는 아래와 같다.

 

요약하자면 CI 모듈이 실제비행버전이 아닌 지상 테스트용이고

최신 branch와 다른 branch의 모듈이기 때문이다.

 

  • The Command Ingest App is not “actual” Flight Software
    • Command Ingest App은 개발 및 테스트 용도로만 사용되며, “실제” 비행 소프트웨어(actual flight sw)에는 포함되지 않음 ⇒ 이는 이더넷 UDP 인터페이스로 위성에 배포되지 않음
  • The Ethernet and UDP interface is not a radio uplink interface
    • 이더넷과 UDP 인터페이스는 위성에서 사용하는 라디오 업링크 인터페이스가 아니며, 지상에서의 테스트용으로 사용 (실제 위성에서는 RF interface)
      비행버전 CI와 CI_LAB (LAB : 지상통신 테스트용 버전)
  • The CFS open source software is customized per mission
    • CFS 소프트웨어는 각 임무의 요구에 따라 맞춤 설정되며 취약점이 발생했던 부분은 커스터마이징의 예시로 나사에서 제시한 부분
    • 실제 위성에 배포되지않는 부분이었으며 애초에 프로그램 자체가 CI_”**LAB**”_APP
  • The kill packets shown today are not valid in master branch of CFS
    • 현재 CFS의 마스터 브랜치에서는 이러한 킬 패킷이 작동하지 않으므로, 실제 운영에는 영향을 미치지 않습니다 (취약점 트리거 된 branch(bootes-rc2) → 나사에서 공식 업데이트 X stale branch)