일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- C++
- 컴퓨터구조
- Bandit
- 워게임
- Leviathan
- 시스템프로그래밍
- 시스템
- 리버싱
- 시스템해킹
- radare2
- pwncollege
- 리눅스
- pwn.college
- 리눅스 커널
- C언어
- 드론
- 어셈블리어
- kernel
- 시스템 프로그래밍
- Pwnable.kr
- wargame
- 프로그래밍
- css
- 취약점
- 커널
- 시그널
- 알고리즘
- px4
- 리눅스커널
- write up
- Today
- Total
Computer Security
CVE-2024-24254 본문
CVE-2024-24254의 내용은 해당 취약점 리포트를 참고하여 작성하였다.
취약버전: 1.14 이하
요약
vehicle_status 변수의 동기화 메커니즘이 부족하여 navigator_main.cpp와 commander.cpp에서 Race Condition 취약점이 발생한다. 이로인해, 드론이 임무를 실행할 때 pause 명령을 수행하지 못할 수 있다.
여러 스레드가 vehicle_status 변수에 엑세스 하기 때문에 한 스레드가 다른 스레드에 의해 동시에 수정될 수 있다. 이로인해 data race가 발생한다.
세부사항
1. PAUSE 명령 전송
사용자가 드론 임무 실행 중 PAUSE 버튼을 클릭하면, GCS에서 드론으로 VEHICLE_CMD_DO_REPOSITION 명령을 보낸다.
2. 드론 상태 변경
commander.cpp 파일에서 이 명령을 수신하면 드론의 상태를 NAVIGATION_STATE_AUTO_LOITER로 변경하고 이를 published한다.
case vehicle_command_s::VEHICLE_CMD_DO_REPOSITION: {
네비게이터와 커맨더가 데이터를 동시에 처리하지 않아도 되도록 설계되어 있다.
3.네비게이터 상태 구독
navigator_main.cpp 파일에서 드론상태를 subscribe하고 status -> run() 함수를 실행한다.
_navigation_mode_array[i]->run(_navigation_mode == _navigation_mode_array[i]);
4.파라미터 계산
필요한 일부 파라미터는 navigator_main.cpp 에서 계산되며, 이는 드론 상태가 아닌 수신된 커맨더에 기반하여 실행된다.
calculate_breaking_stop(rep->current.lat, rep->current.lon, rep->current.yaw);
5.Race Condition 발생
navigator_main.cpp가 GCS에서 명령을 수신하고 제동 지점을 계산할 때 발생한다. commander.cpp가 아직 UAV의 상태를 명령에 따라 수정하지 않았기 때문에, status->run()은 예상한 대로 제동 지점을 published하지 않는다. commander.cpp가 드론의 상태를 수정하는 동안, navigator_main.cpp는 이미 다음 단계로 넘어가서 방금 계산한 제동 지점을 덮어쓰게 된다.
PX4-Autopilot/src/modules/navigator/navigator_main.cpp
} else if (PX4_ISFINITE(cmd.param7) || PX4_ISFINITE(cmd.param4)) {
// Position is not changing, thus we keep the setpoint
rep->current.lat = PX4_ISFINITE(curr->current.lat) ? curr->current.lat : get_global_position()->lat;
rep->current.lon = PX4_ISFINITE(curr->current.lon) ? curr->current.lon : get_global_position()->lon;
두 번째 REPOSITION CMD가 여기서 트리거 되어 브레이크포인트를 덮어쓴다.
패치방안
PAUSE명령을 처리하는 동안 Race Condition을 방지하기 위해 navigator 모드를 즉시 변경한다.
vehicle_command_s cmd{};
_vehicle_command_sub.copy(&cmd);
if(cmd.command == vehicle_command_s::VEHICLE_CMD_DO_REPOSITION){
_navigation_mode=&_loiter;
}
1.vehicle_command_s 구조체를 초기화하고, _vehicle_command_sub로부터 명령을 복사한다.
-
- _vehicle_command_sub : 수신된 명령을 구독하는 객체
2. 수신된 명령이 VEHICLE_CMD_DO_REPOSITION인지 확인한다. 아래의 코드는 PAUSE 명령이다.
if(cmd.command == vehicle_command_s::VEHICLE_CMD_DO_REPOSITION){
3.네비게이션 모드 변경
_navigation_mode = &_loiter;
네비게이션 모드를 _loiter로 즉시 변경한다. LOITER 모드는 드론이 현재 위치에서 호버링하며 대기하도록 한다.
이를 통해 Race Condition 없이 즉시 드론을 멈추는 상태로 전환한다.
'프로그래밍 > Drone' 카테고리의 다른 글
CVE-2023-47625 (0) | 2024.08.02 |
---|---|
CVE-2023-46256 (0) | 2024.08.01 |
CVE-2021-46896 (0) | 2024.07.31 |
CVE-2021-34125 (0) | 2024.07.30 |