
현대 GCS에 대한 취약점 및 익스플로잇 모음
드론-지상 통제국 공격 벡터, 취약점 및 익스플로잇
오늘날 드론 군집은 한 명의 운영자가 단일 지상국에서 수십 또는 수백 대의 드론을 비행하는 형태입니다. 이로 인해 지상 통제국은 적에게 가치 있는 표적이 됩니다. 조종사가 일반적으로 위치한 곳이며, 임무 데이터를 자주 저장하고, UxS 네트워크와 군집 내 다른 드론으로 측면 이동하기 위한 주요 벡터입니다.
대부분의 드론 보안 연구는 드론 자체를 표적으로 삼는 데 집중해 왔습니다. Infected Drone 연구는 대안적 접근 방식을 취하며, 단일 감염된 드론이 자신에게 연결되는 지상국을 어떻게 공격할 수 있는지 강조합니다. 대부분의 지상 통제 소프트웨어가 드론이 보내는 모든 것을 신뢰하기 때문에, 인증, 검증, 정제가 부족하여 감염된 드론의 데이터가 운영자 머신에서 파일 CRUD, 코드 실행 또는 충돌로 이어질 수 있습니다.
이 저장소는 지상 통제국 소프트웨어의 취약점을 문서화하고 이에 대한 작동하는 개념 증명 코드를 제공합니다. 이는 교육 목적으로만, 그리고 운영자가 자신의 노출을 이해하고 유지관리자가 이러한 문제를 재현하고 수정할 수 있도록 게시됩니다.
PoC는 자신이 소유하거나 테스트에 대한 서면 허가를 받은 시스템에 대해서만 실행하십시오. 모든 PoC는 벤치용으로 작성되었습니다: 페이로드는 무해한 마커이며, 여기에 있는 어떤 것도 다른 사람의 항공기나 지상국에 대해 사용하도록 패키징되지 않았습니다. 자신이 통제하지 않는 시스템에 이 자료를 사용하는 것은 어디서든 불법일 가능성이 높습니다.
각 발견 사항의 재현 섹션은 필요한 것과 수행하는 작업을 명시합니다. 무엇이든 실행하기 전에 읽어보십시오.
범례:
전달 클래스는 공격자가 링크에서 해야 하는 작업이며, 어떤 벡터가 작동하는지를 결정합니다. 푸시 발견 사항은 GCS에 도착하는 프레임만 필요하므로, 주입 가능한 모든 벡터로 충분합니다. 핸드셰이크 및 요청/응답 발견 사항은 공격자가 대화 상대가 되거나 완전히 통제해야 하며, 이는 온버스 주변기기, 감염된 컴패니언, 공급망, 또는 완전한 MITM을 선호합니다.
Fix 열은 제출된 업스트림 풀 리퀘스트를 연결합니다. 15개 발견 사항 중 10개는 벤더 자체 저장소에 패치가 제출된 상태로 제공됩니다.
| ID | 제품 | 심각도 | CWE | 싱크 클래스 | 전달 클래스 | 감염된 FC / 공급망? | 악성 온버스 주변기기? | 감염된 컴패니언? | WiFi/UDP 주입? | TCP/클라우드 MITM? | SiKW00F 주입? | SiK 전체-MITM? | Fix |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| QGC-01 | QGroundControl | 🟠 HIGH | 22/73/170 | CAMERA_INFORMATION → 경로 순회 쓰기 (연결 시 제로클릭 쓰기) | 푸시 (CAMERA_INFORMATION) + cam_definition_uri를 통한 콘텐츠 | ✅ | ✅ 가장 자연스러움 (카메라) | ✅ | ✅ | ✅ | ✅ 트리거는 푸시; 이름 필드는 인라인 | ✅ | PR #15083 |
| QGC-02 | QGroundControl | 🔴 CRITICAL | 22/73/494/918 | COMPONENT_METADATA uri → 임의 파일 쓰기 → 연결 시 제로클릭 RCE | 요청/응답 (IP를 통한 URI 가져오기) | ✅ | ✅ 메타데이터 uri 방출 | ✅ | ✅ 트리거용 | ✅ | ⚠️ 푸시 트리거 가능; 가져오기는 IP를 통해 | ✅ | PR #15084 |
| QGC-03 | QGroundControl | 🟠 HIGH | 22/770 | FTP 목록 → 순회 쓰기 + 오프셋 디스크 채우기 | 핸드셰이크 (MAVFTP 목록/다운로드) | ✅ | ✅ 피어가 FTP 응답 | ✅ | ⚠️ 주입 가능, 자체 핸드셰이크는 더 어려움 | ✅ | ⚠️ 경쟁 상태 세션/시퀀스 | ✅ 브리지가 목록 제공 | PR #15085 |
| QGC-04 | QGroundControl | 🟡 MED | 191/125 | DataFlash .bin 파서 OOB 읽기 + 언더플로우 | 핸드셰이크 (악성 .bin 로그 다운로드) | ✅ | ✅ 피어가 DataFlash 제공 | ✅ | ⚠️ | ✅ | ⚠️ 로그 청크를 제공해야 함 | ✅ 브리지가 .bin 공급 | PR #15086 |
| MP-01 | Mission Planner | 🟠 HIGH | 22→94 | MAVFTP 순회 → 플러그인 로더 RCE | 핸드셰이크 (MAVFTP req/ack → RCE) | ✅ | ✅ 피어가 목록 응답 | ✅ 전체 링크 통제 | ⚠️ 주입은 쉬움, 하지만 핸드셰이크를 소유해야 함 | ✅ 릴레이에서 재작성 | ⚠️ 경쟁에서 이기고 세션/시퀀스를 맞춰야 함 | ✅ 브리지가 FTP 대화 소유 | PR #3774 |
| MP-02 | Mission Planner | 🟠 HIGH | 94/78 | gst:// → gst_parse_launch (파일 r/w + 유출) | 푸시 (VIDEO_STREAM_INFORMATION → gst) | ✅ | ✅ 카메라가 uri 알림 | ✅ | ✅ UDP 데이터그램 | ✅ | ✅ 원샷 스트림 프레임 | ✅ 간단히 | PR #3775 |
| MP-03 | Mission Planner | 🟠 HIGH | 74/601 | STATUSTEXT 마크업 → Process.Start | 푸시 (STATUSTEXT → ShellExecute) | ✅ | ✅ 모든 컴포넌트가 방출 | ✅ | ✅ | ✅ | ✅ 발사 후 망각 텍스트 | ✅ | PR #3776 |
| MP-04 | Mission Planner | 🟡 MED | 248/20/1050 | RALLY_TOTAL/FENCE_TOTAL → 검증되지 않은 int.Parse + UI 스레드에서 O(n²) (연결 시 제로클릭) | 푸시 (PARAM_VALUE, 연결 후 자동) | ✅ | ✅ PARAM_VALUE 방출 | ✅ | ✅ | ✅ | ⚠️ MP의 딕셔너리에 파라미터를 넣어야 함 | ✅ | PR #3777 |
| MAVSDK-01 | MAVSDK | 🟡 MED | 918/749 | 컴포넌트 메타데이터 curl SSRF + file:// (프로토콜 허용 목록 없음) | 요청/응답 (IP를 통한 COMPONENT_METADATA.uri 가져오기) | ✅ | ✅ 메타데이터 uri 방출 | ✅ | ✅ 트리거용 | ✅ | ⚠️ 푸시 트리거 가능; 가져오기는 IP를 통해 | ✅ | 없음 |
| MAVSDK-02 | MAVSDK | 🟠 HIGH | 22/73/918 | cam-definition SSRF + mftp:// 순회 → 샌드박스 외부 파일의 제로클릭 파괴 | 푸시 (CAMERA_INFORMATION.cam_definition_uri, 자동) | ✅ | ✅ 가장 자연스러움 (카메라) | ✅ | ✅ | ✅ | ✅ 자동 소비 푸시 | ✅ | PR #3073 |
| MAVSDK-03 | MAVSDK | 🟠 HIGH | 409/400/770/459 | .xz cam-definition 또는 COMPONENT_METADATA → 무제한 압축 해제 → 지속적 디스크 고갈 | 푸시 (CAMERA_INFORMATION.cam_definition_uri, 자동) — 단순 HEARTBEAT로 시작됨 | ✅ | ✅ 가장 자연스러움 (카메라) | ✅ | ✅ | ✅ | ✅ 자동 소비 푸시; 2 GiB당 57.6 kbps 에어타임 약 50초 | ✅ | PR #3074 |
| MAVPROXY-01 | MAVProxy | 🟠 HIGH | 502 | UDP를 통한 asterix pickle.loads → RCE | IP 사이드채널 (UDP, MAVLink RF 링크가 아님) | ❌ MAVLink 링크 상이 아님 | ❌ 별도 UDP 소켓 | ⚠️ :45454에 도달할 수 있는 경우에만 | ✅ 호스트:45454로 UDP | ❌ 자체 UDP 소켓, 릴레이 아님 | ❌ RF/MAVLink 링크 상이 아님 | ❌ RF/MAVLink 링크 상이 아님 | 업스트림 #1728로 수정됨, 미출시 |
| MAVROS-01 | mavros | 🟡 MED | 345/770 | PARAM_VALUE → 위조된 전역 /parameter_events + 무제한 맵 | 푸시/스트림 (PARAM_VALUE 주입, 핸드셰이크 없음) | ✅ | ✅ PARAM_VALUE 방출 | ✅ | ✅ UDP 플러드 | ✅ | ✅ PARAM_VALUE 플러드 | ✅ | 없음 |
| MAVROS-02 | mavros | 🟠 HIGH | 125/617/248 | FTP 쓰기-ack → 무제한 std::advance → 힙 노출 + 프로세스 중단 | 핸드셰이크 (FTP 응답 오염 → 충돌) | ✅ | ✅ 피어가 잘못된 FTP 전송 | ✅ | ⚠️ | ✅ | ⚠️ 잘못된 형식의 응답을 넣어야 함 | ✅ 브리지가 잘못된 응답 주입 | 없음 |
| DRONEKIT-01 | DroneKit | ⚪ INFO | 20 | 신뢰 경계 핸드오프 (param_id / STATUSTEXT) | 푸시 (텔레메트리 → 앱 콜백; 설계상 핸드오프) | ✅ | ✅ 모든 컴포넌트 | ✅ | ✅ | ✅ | ✅ 모든 푸시 프레임이 콜백에 도달 | ✅ | n/a |
매트릭스는 발견 사항당 7개 열을 점수화합니다: 아래 5개 벡터와, 주입 대 MITM의 미묘함을 고려하여 아래에 별도로 설명하는 두 가지 SiK 라디오(RF 텔레메트리) 모드입니다.
감염된 비행 컨트롤러, 시리얼 연결, 또는 공급망. 로컬 공격자 또는 악성 비행 컨트롤러가 GCS 호스트나 라디오에 물리적으로 연결됩니다. 기체 또는 펌웨어는 운영자가 직접 만든 것이 아닙니다: 데모 유닛, 렌탈, 압수된 기체, 또는 중고 기체로, GCS가 연결되는 순간 적대적 MAVLink를 방출하도록 펌웨어가 이식되어 있습니다. 운영자의 자신의 GCS가 피해자입니다; "기체"는 전원이 켜지기 전부터 적대적이었습니다. 모든 발견 사항에 적용되며, 연결 시점 핸드셰이크 익스플로잇을 전달하는 가장 깔끔한 방법입니다. 이는 감염된 기체에 직접 연결하거나 데이터를 추출할 수 있는 포렌식 분석가에게도 확장됩니다. 이러한 아티팩트가 적절히 처리되지 않으면 분석가의 컴퓨터와 네트워크에 감염되거나 확산될 수 있습니다.
기체 자체 버스 상의 악성 / 위조 MAVLink 주변기기. 서드파티 카메라, 짐벌, ADSB-in, 거리계, 또는 MAVLink를 말하고 그 자체가 공격자인 모든 장치. 이는 링크 상의 정당한 참여자로서 적대적 프레임을 방출합니다. 오염된 메시지를 광고하는 위조 "스마트 카메라"는 실제 카메라가 하는 일을 그대로 수행하되, 적대적 값으로 수행합니다.