Computer Security

CVE-2024-24254 본문

프로그래밍/Drone

CVE-2024-24254

쿠리 Kuri 2024. 8. 3. 18:00
반응형
반응형

CVE-2024-24254의 내용은 해당 취약점 리포트를 참고하여 작성하였다.

 

https://github.com/Drone-Lab/PX4-Autopilot/blob/report-can-not-pause-vulnerability/Multi-Threaded%20Race%20Condition%20bug%20found%20in%20PX4%20cause%20drone%20can%20not%20PAUSE.md

 

PX4-Autopilot/Multi-Threaded Race Condition bug found in PX4 cause drone can not PAUSE.md at report-can-not-pause-vulnerability

PX4 Autopilot Software. Contribute to Drone-Lab/PX4-Autopilot development by creating an account on GitHub.

github.com

 

취약버전: 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
Comments