
現代のGCSに対する脆弱性とエクスプロイトのコレクション
ドローンから地上管制局への攻撃ベクター、脆弱性、エクスプロイト
今日のドローン群は、1人のオペレーターが単一の地上局から数十機または数百機のドローンを飛行させるものです。これにより、地上管制局は敵対者にとって価値の高い標的となります。通常パイロットがそこに位置し、ミッションデータが保存されることが多く、UxSネットワークや群内の他のドローンを横断するラテラルムーブメントの主要なベクターとなるからです。
ドローンセキュリティ研究のほとんどは、ドローン自体を標的にすることに焦点を当ててきました。Infected Droneの研究は別のアプローチを取り、1機の侵害されたドローンが、それに接続する地上局をどのように攻撃できるかを明らかにしています。ほとんどの地上管制ソフトウェアはドローンから送られてくるものをそのまま信頼するため、認証、検証、サニタイズが欠如しており、侵害されたドローンからのデータが、オペレーターのマシン上でのファイルCRUD、コード実行、またはクラッシュにつながる可能性があります。
このリポジトリは、地上管制局ソフトウェアの脆弱性を文書化し、それらに対する動作する概念実証コードを提供しています。これは教育目的のみで公開されており、オペレーターが自身の露出を理解し、メンテナーがこれらの問題を再現して修正できるようにするためのものです。
PoCは、あなたが所有するか、テストの書面による許可を得ているシステムに対してのみ実行してください。それらはすべてベンチ向けに書かれており、ペイロードは無害なマーカーであり、他人の航空機や地上局に対して使用するためにパッケージ化されたものは何もありません。あなたが制御していないシステムに対してこの資料を使用することは、あなたがどこにいても違法となる可能性が高いです。
各発見の再現セクションには、必要なものと何をするかが記載されています。何かを実行する前に読んでください。
凡例:
配送クラスとは、攻撃者がリンク上で何をしなければならないかであり、どのベクターが機能するかを決定します。プッシュの発見は、GCSにフレームが到着するだけでよいため、注入可能なベクターであれば十分です。ハンドシェイクおよびリクエスト/レスポンスの発見は、攻撃者が会話相手そのものであるか、完全に制御する必要があり、オンバスペリフェラル、侵害されたコンパニオン、サプライチェーン、または完全なMITMが有利です。
Fix列は、提出済みのアップストリームプルリクエストにリンクしています。15件の発見のうち10件は、ベンダー自身のリポジトリに対して提出されたパッチとともに提供されています。
マトリクスは発見ごとに7つの列をスコアリングします: 以下の5つのベクター、および2つのSiK無線 (RFテレメトリ) モードで、後者は注入対MITMのニュアンスを考慮して以下に独自の注記があります。
感染したフライトコントローラー、シリアル接続、またはサプライチェーン。 ローカル攻撃者または悪意のあるフライトコントローラーが、GCSホストまたは無線に物理的に接続されます。機体またはファームウェアは、オペレーターが構築していないものです: デモユニット、レンタル、押収された機体、または中古機で、そのファームウェアはGCSが接続した瞬間に敵対的なMAVLinkを発するように移植されています。オペレーターの自身のGCSが被害者であり、「機体」は電源を入れる前から敵対的でした。すべての発見に適用され、接続時ハンドシェイクエクスプロイトを配送する最もクリーンな方法です。これは、感染した機体に直接接続したり、そこからデータを抽出したりする可能性のあるフォレンジックアナリストにも及びます。これらのアーティファクトは、適切に処理されないと、アナリストのコンピューターやネットワークに感染または拡散する可能性があります。
機体自身のバス上の悪意のある/偽造MAVLinkペリフェラル。 サードパーティのカメラ、ジンバル、ADSB-in、レンジファインダー、またはMAVLinkを話し、それ自体が攻撃者である任意のデバイス。これはリンク上の正当な参加者であり、敵対的なフレームを発しています。毒されたメッセージを広告する偽造「スマートカメラ」は、本物がすることを正確に行っているだけで、敵対的な値を持っているだけです。
侵害された機内コンパニオンコンピューター (mavlink-router / MAVProxyを実行するRaspberry Pi / Jetson)。一度侵害されると、それは機体エンドポイントになり、リンクへの完全な双方向アクセスとそのライブ状態の可視性を持ちます。任意のハンドシェイクに応答し、任意のプッシュフレームを発することができ、このセットのすべての発見に対して実行可能になります。
WiFi / UDPテレメトリブリッジ (ESP8266 / ESP32「wifi telemetry」)。アクセスポイントまたはLAN上の誰でもMAVLinkデータを注入できます。これにより注入ベクターのコストがほぼゼロになり、傍受もできる攻撃者 (ARP/AP MITM) にとっては、完全なハンドシェイク制御も可能になります。
TCP / クラウドリレー (SITL、mavlink-router TCP、mavp2p、商用UAVクラウドサービスなどの4G/LTEクラウドGCS)。リレーでのMITM、または公開されたTCPポートに到達できる誰でも、ストリームを書き換えることができます。クラウド/4Gリンクは地理的な影響範囲を大幅に広げ、相互認証を欠くことがよくあります。
ArduPilot/PX4のホビーおよびプロシューマー機体の支配的な実RFテレメトリパスは、SiK無線ペアであり、MAVLinkを解析または検証しない透過的なシリアルブリッジであるため、敵対的なコンテンツに対するGCSの保護をゼロしか提供しません。不正なSiKモジュールは、sikw00fを使用して既存のリンクに参加またはブリッジします。2つの攻撃モードがあり、信頼性は大きく異なります:
STATUSTEXT、PARAM_VALUE、CAMERA_INFORMATIONなど) には信頼性があり、応答は不要です。ハンドシェイクプロトコル (MAVFTP、パラメータ/ログダウンロード) には信頼性が低く、インジェクターはエアタイム競合に勝ち、制御していないセッション/シーケンスを一致させる必要があります。注: SiK暗号化 (AES-128、サポートされている場合) は、静的共有キーでデフォルトでオフになっています。
| ID | 製品 | 深刻度 | CWE | シンククラス | 配送クラス | 感染FC / サプライチェーン? | 悪意のあるオンバスペリフェラル? | 侵害されたコンパニオン? | WiFi/UDP注入? | TCP/クラウドMITM? | SiKW00F注入? | SiK完全MITM? | 修正 |
|---|
| 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のdictにパラメータを着地させる必要あり | ✅ | 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あたり約50秒の57.6 kbpsエアタイム | ✅ | PR #3074 |
| MAVPROXY-01 | MAVProxy | 🟠 HIGH | 502 | asterix pickle.loads over UDP → 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 |