
dataSIMS Avionics ARINC 4.5.3(Data Device Corporation)におけるローカル・スタックベース・バッファオーバーフロー
こんにちは。Kağan Çaparです。2020年2月、私はDDCのdataSIMSアビオニクス・データバスソフトウェアにローカルなスタックベースのバッファオーバーフローを発見し、2021年2月にExploit-DBで概念実証(PoC)を公開しました。それから約5年後、2026年1月にVulnCheckが遡及的なCVEとしてCVE-2021-47881を割り当てました。この割り当てを知ったのは事後であり、VulnCheckからの連絡によるものではありません。
このリポジトリは、その発見のアーカイブ記録です。公開当時のまま保存されたオリジナルのPoC、バイト単位で同一のPython 3移植版、ペイロードの注釈付き分解、そして公開済みCVEレコードの2つの問題に対する訂正を含みます。
最初に範囲を明確にします。 これは記録であり、根本原因分析ではありません。dataSIMSはクローズドソースの商用ソフトウェアであり、ベンダーのパッチはなく、現行リリースに対する再テストも行っていません。ここで検証可能なものは検証して示します。それ以外のものは制限事項で明示します。CVE-2026-5201のような深さを期待してここに来たのであれば、先にそのノートを読んでください。
| CVE | CVE-2021-47881 |
| CWE | CWE-121 — スタックベースのバッファオーバーフロー |
| CVSS v4.0 | 6.7 MEDIUM — AV:L/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N(VulnCheck) |
| CVSS v3.1 | 8.4 HIGH — AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H(VulnCheck) |
| 影響を受ける製品 | dataSIMS Avionics ARINC 664-1、バージョン 4.5.3 |
| ベンダー | Data Device Corporation |
| CNA | VulnCheck |
| 発見日 | 2020-02-17 |
| PoC公開日 | 2021-02-19 — EDB-49577 |
| CVE公開日 | 2026-01-23(NVD) |
| ベンダーパッチ | 公開なし |
| テスト環境 | Windows 10 Enterprise x64 |
影響を受けるコンポーネントは、dataSIMS 4.5.3のARINC 664-1モジュールです。このモジュールは、所属するモジュールにもかかわらずmilstd1553result.txtと命名された結果ファイルを読み戻します。このファイル名は、スイートのMIL-STD-1553系統から引き継がれたベンダーの遺物であり、影響を受けるモジュールを示すものではありません。攻撃者が整形した過長なバージョンの当該ファイルを供給すると、読み戻し経路で固定サイズのスタックバッファがオーバーフローし、保存されたリターンアドレスが上書きされます。クラッシュはEIPの完全な制御を伴って発生します。
EIP 42424242 <- ペイロードからの'BBBB'
ECX 42424242
C0000005 <- STATUS_ACCESS_VIOLATION
公開されたPoCは1040バイトで、EIPの上書きで停止します。コード実行には至らず、その意図もありませんでした — 悪用可能性(正直な評価)を参照してください。
移植版(py poc/poc_py3.py --layout)の実行で検証されたPoCのフィールドレイアウト:
| フィールド | オフセット | 長さ | 内容 |
|---|---|---|---|
junk | 0 / 0x000 | 600 | 0x41 フィラー |
align | 600 / 0x258 | 8 | "22221111" |
prop | 608 / 0x260 | 380 | 0x43 フィラー |
imp | 988 / 0x3dc | 10 | "bzhrturlu2" |
imp2 | 998 / 0x3e6 | 9 | "aracag" 0x13 "1z" |
overwrite | 1007 / 0x3ef | 4 | 0x42 × 4 → 保存されたリターンアドレス |
buf | 1011 / 0x3f3 | 29 | shikata_ga_nai デコーダスタブ |
| 合計 | 1040 | sha256 530efb5efef917082e40dcf379f5e0a526375724af18aba6f0270f794f96d066 |
EIPのオフセットは1007です。 これは!mona findmspやpattern_offset.rbから得られる数字ではありません — 5つの手動調整フィールドの合計です。オリジナルのPoCは、オフセットを解析的に特定するのではなく、リターンアドレスが移動するまでクラッシュを拡大させることで構築されました。私はこれを粉飾せずに明記します。クリーンな書き直しであれば、保存されたリターンアドレスまでの真の距離を特定し、align、imp、imp2はどれも意味を持たないため、完全に削除できるでしょう。imp/imp2はフィラー文字列であり、インポートではありません。
bufは29バイトのmsfvenom shikata_ga_naiスタブです。ndisasm -b32で逆アセンブルした結果:
00000000 DAC1 fcmovb st1 ; ジャンクFPU命令(sgn署名)
00000002 D97424F4 fnstenv [esp-0xc] ; GetPC
00000006 58 pop eax ; eax = &stub
00000007 BB0B7E9762 mov ebx,0x62977e0b ; XORキー
0000000C 33C9 xor ecx,ecx
0000000E B101 mov cl,0x1 ; <-- 1つの4バイトブロック
00000010 315819 xor [eax+0x19],ebx ; +0x19のブロックをデコード
00000013 83E8FC sub eax,-4 ; eax += 4
00000016 035815 add ebx,[eax+0x15] ; キースケジュール
00000019 E9 db 0xe9 ; <-- エンコード済みブロック、コードではない
0000001A 8B db 0x8b
0000001B 7C9C jl 0xffffffb9
これから2つのことが明らかになり、どちらもペイロードが実行され得ないことを意味します。
mov cl,0x1 — デコードループは単一の4バイトブロック用に構成されています。背後に実際のペイロードはなく、その4バイトだけです。\xe2\xf4(loop)ターミネータが存在しません。 完全なsgnスタブは、エンコードされた本体の前にloopでデコードループを終了させます。ここでは実行がadd ebx,[eax+0x15]からE9 8B 7C 9Cへまっすぐ落ちます。これはその時点ではまだエンコードされており、いずれにせよ有効な命令シーケンスでもありません。つまり、このスタブはペイロードの末尾を占めるプレースホルダーです。これはExploit-DBでのPoCの説明と一致しており、正直な解釈です:これはEIP制御のデモであり、動作するエクスプロイトではありません。
CVSS v3.1ベクターのやり方ではなく、ブローカーやベンダーが行うようにこれを評価します:
milstd1553result.txtはアプリケーション自身が生成するファイルであり、同じユーザーがすでに制御している場所にあります。これを書き換えられる攻撃者は、通常、そのユーザーとしてコードを実行することもすでに可能です。これはセキュリティバグというより、堅牢性バグです。EIP制御は、それ自体ではほとんど意味を持ちません。これを実行に変えるにはDEP/ASLR対策の物語 — /DYNAMICBASEを持たないモジュール、ROPチェーン、または部分的な上書き — が必要です。そのいずれも行われておらず、現行ビルドにどのような緩和策が含まれているかも確認していません。UI:Aは現実を反映しています。v3.1のUI:Nは反映していません。誰かがこれを本当に興味深いものにしたいのであれば、生産的な攻撃面はこのファイルではなく、DDCが1553/664 PCIeカード用に出荷しているカーネルドライバ(IOCTL処理 → LPE)、ネットワークに面したARINC 664/AFDXフレーム解析、そしてスイートが信頼できないソースから消費する入力ファイル形式です。これらは実際の境界を越えます。これは越えません。
CVEレコードには、私の名前で公開されている以上、明確に述べるべき2つの欠陥があります。
レコードの製品指定 —「dataSIMS Avionics ARINC 664-1 バージョン 4.5.3」— は正しいです。影響を受けるコンポーネントは、私のオリジナルのExploit-DBタイトルで述べたとおり、ARINC 664モジュールです。
欠陥は、CNAが添付したベンダー参照にあります。NVDはBU-69414を引用していますが、これはDDCのMIL-STD-1553ソフトウェア製品ページであり、この発見が影響するものとは異なるデータバススタックです。ARINC 664はAFDX(プロファイル化されたスイッチドイーサネット、ARINC 664 Part 7)です。MIL-STD-1553は1Mbpsの二重冗長コマンド/レスポンスバスです。両者は無関係の規格です。
誤引用の可能性が高い原因は、結果ファイル名です。dataSIMSはARINC 664モジュールの結果ファイルをmilstd1553result.txtと名付けています — これはスイートのMIL-STD-1553系統からの残存物です。CVEの説明を読んで一致するベンダー製品ページを探す人は誰でも、この文字列を辿って1553系にまっすぐ到達します。それが実際に起こったことのようです。ファイル名は影響を受けるモジュールの証拠ではなく、1553製品ページを指すレコードは、ディフェンダーを誤ったコンポーネントの監査へと導きます。
両方のベクターはVulnCheck由来であり、重要となる2つの点で互いに矛盾しています:
| v3.1 (8.4 HIGH) | v4.0 (6.7 MEDIUM) | |
|---|---|---|
| ユーザー操作 | UI:N — 不要 | UI:A — 必須 |
| 影響 | C:H/I:H/A:H — CIA完全侵害 | VC:N/VI:N/VA:H — 可用性のみ |
両方が正しいことはあり得ません。v4.0ベクターが擁護可能な方です。PoCが示すのはクラッシュであり、情報漏えいや完全性の喪失ではありません。v3.1のスコア8.4はこの発見を過大評価しており、私はそれをここで明言するほうを選びます。
ここで必要なものに対象ソフトウェアは含まれません。PoCは不正なファイルを書き込むだけです。オーバーフローのトリガーにはdataSIMS 4.5.3が必要ですが、これはライセンスされた商用ソフトウェアであり、このリポジトリは配布しません。
# フィールドマップを表示し、何も書き込まない
py poc/poc_py3.py --layout
# 1040バイトのペイロードを書き込む
py poc/poc_py3.py -o milstd1553result.txt
その後、影響を受けるビルドでデバッガの下にファイルを読み込ませ、EIPの上書きを観察します。poc/49577.pyはオリジナルのPython 2ソースをそのままアーカイブしたもので、Python 3では実行できません。
移植版はバイト単位で同一の1040バイトファイル(sha256 530efb5e…)を生成します。変更が必要だったのは3点、そしてバグのように見えてバグではないものが1点あります:
print len(win32)はPython 2では文であり、Python 3ではSyntaxErrorになります。strフィールドとbytesシェルコードを連結しています。Python 2ではstrがバイトそのものだったため許容されましたが、Python 3ではTypeErrorが発生します。open(..., "w")は"wb"に変更する必要があります。テキストモードではPython 3がスタブ内の0x80以上のすべてのバイトをUTF-8エンコードし — 0xda → 0xc3 0x9a — ペイロードを静かに破損させ、長さを変えてしまいます。imp2 = "\x61\x72\x61\x63\x61\x67\x131\x7a"はバージョン依存の癖ではありません。\xはPython 2と3の両方で正確に2桁の16進数を受け取るため、\x131は0x13の後に文字1が続くものになります。このフィールドは両方で9バイトです。単に見た目が悪いだけです。何が行われ、何が行われなかったかを誰も推測しなくて済むように、明示的に述べます:
EIPの上書きが結果のすべてです。| 日付 | 出来事 |
|---|---|
| 2020-02-17 | 脆弱性を発見 |
| 2021-02-19 | PoC公開 — EDB-49577 |
| 2026-01-22 | VulnCheck勧告公開 |
| 2026-01-23 | CVE-2021-47881がNVDに公開 |
| 2026-06-17 | NVDレコード最終更新 |
Kağan Çapar — GitHub · Exploit-DB · LinkedIn · X