
CVE-2026-67276 RouterOS SSH公開鍵認証バイパス ラボ PoC
ラボ用途のみ。 所有するRouterOSインスタンスに対してのみ実行してください。 所有していないデバイスへの攻撃は犯罪です(CFAA、ポーランド刑法第267条、各国の同等法規)。
CERT PL(2026-09-05)は、「MikroTrick」 というチェーン(SSHがインターネットに到達可能な場合の未認証での完全なデバイス乗っ取り)として実際に悪用されている6件のRouterOS脆弱性を公開しました。MikroTikは2026-09-03に7.25beta3 / 7.24.2 / 7.23.4 / 6.49.21で修正済みです。
| CVE | タイプ | 根本的な欠陥 |
|---|
| 2026-67276 | CWE-347(本PoC) | SSHユーザー認証キーマッチチェックは(キータイプ、モジュラス)を検証するが指数を省略。署名検証はクライアント提供のキーを使用 ⇒ e=1偽造 |
| 2026-86060 | CWE-88 | 禁止文字(攻撃ログで-2を確認)で始まるユーザー名による引数インジェクション ⇒ ポリシーマスク変更 ⇒ 権限昇格 |
| 2026-67279 | CWE-841 | ユーザー認証完了前のクライアント要求リキー後にSSHが接続プロトコルに入る ⇒ ファイル名前空間での未認証exec |
| 2026-67277 | CWE-306 | bandwidth-testの認証前状態+未初期化バッファ開示+サイズアンダーフロー ⇒ カーネルメモリリーク/再起動 |
| 2026-67278 | CWE-347 | X.509が不正なRSA/PKCS#1v1.5署名を受け入れる。e=3トラストアンカー ⇒ 信頼済み中間証明書偽造 |
| 2026-67281 | CWE-824 | WebFig /jsproxyの古い未初期化プリンシパルポインタ+パスエスケープ ⇒ rootファイル読み取り |
脆弱な範囲(全6件):[7.24, 7.24.2)、[7.0.0, 7.23.4)、[6.0.0, 6.49.21)。
{ssh-rsa, e=1, n=victim}を提示すると、sig^1 mod n == sigとなるため、有効な「署名」は単にEMSA-PKCS1-v1_5(hash, authdata) — 被害者の公開モジュラスを知る誰でも計算可能です。秘密鍵は不要です。前提条件(開示自体の最小要件):対象ユーザー名+そのユーザーの認証済みRSA公開モジュラス。
n(漏洩・取得した.pub、プロビジョニング記録、または--modulus-hexから)。これが唯一の秘密に近い入力です。秘密鍵は決して必要ありません。ForgeKeyフック — 標準のOpenSSHでは不可)。ssh-rsa、7.xではrsa-sha2-256も)。forge_67276.py — プリミティブ:OpenSSH公開鍵パース、RFC 8017 EMSAエンコーダ、偽造ブロブ/署名ビルダー、RFC 8017参照検証器。selftest.py — ルーター不要のローカル証明:エンコーダはOpenSSLとバイト単位で同一(実署名反転経由)、偽造署名はe=1で検証成功かつ65537では失敗、完全なRFC 4252 §7ワイヤー形状シミュレーション。全15チェックPASS。poc_67276.py — バイパスを実行するparamikoクライアント(接続ごとのアルゴリズム固定。--lab-i-own-this-target必須)。console_setup.py — qemuシリアルtelnet経由の一回限りのCHR準備(10.0.2.2経由で被害者キーを取得、adminにインポート、ssh有効化)。sanity_real_key.py — コントロール:通常の公開鍵認証が最初に成功する必要があります。victim_rsa / victim.pub — 生成された使い捨て2048ビット「被害者」キーペア。Gitから意図的に除外。python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
ssh-keygen -q -t rsa -b 2048 -N '' -C victim-key -f victim_rsa
/root/mikrotrick-lab/、ホストブリッジbr0
(192.168.100.1/24)にtap0-tap3。br0上のdnsmasqはMACごとのリース付き。| VM | イメージ | ゲストIP | MAC | Mac側トンネル |
|---|---|---|---|---|
| chr-6.49.20 | 脆弱な6.x | 192.168.100.11 | 52:54:00:aa:00:11 | 127.0.0.1:2222 |
| chr-6.49.21 | パッチ済み6.x | 192.168.100.12 | 52:54:00:aa:00:12 | 127.0.0.1:2223 |
| chr-7.23.3 | 脆弱な7.x | 192.168.100.13 | 52:54:00:aa:00:13 | 127.0.0.1:2224 |
| chr-7.23.4 | パッチ済み7.x | 192.168.100.14 | 52:54:00:aa:00:14 | 127.0.0.1:2225 |
labpass123、adminにインポートされた被害者キー。初回ログイン時の強制パスワード変更はSSH(bootstrap_password.pyがダイアログを読み取る)またはQEMUモニターsendkey(mon_type.py)経由で実行 — CHRのシリアルコンソールはデフォルトで無効。VGAコンソールはモニターscreendumpでのみ読み取り可能。ssh -N -L 2222:192.168.100.11:22 -L 2223:192.168.100.12:22 -L 2224:192.168.100.13:22 -L 2225:192.168.100.14:22 [email protected]再実行(例:VM3):
qemu-system-x86_64 -enable-kvm -m 512 -smp 2 -name chr-7.23.3 \
-drive file=/root/mikrotrick-lab/chr-7.23.3.img,format=raw,if=virtio \
-netdev tap,id=n2,ifname=tap2,script=no,downscript=no \
-device e1000,netdev=n2,mac=52:54:00:aa:00:13 \
-display none -monitor unix:/root/mikrotrick-lab/mon3.sock,server,nowait &
./.venv/bin/python import_key.py 127.0.0.1 admin labpass123 victim.pub 2224
./.venv/bin/python sanity_real_key.py 127.0.0.1 2224 victim_rsa admin # ベースライン
./.venv/bin/python poc_67276.py --host 127.0.0.1 --port 2224 \
--username admin --pubkey victim.pub --algos rsa-sha2-256,ssh-rsa \
--exp-enc aligned --exec '/system resource print' --lab-i-own-this-target
| ターゲット | 実秘密鍵(ベースライン) | 偽造e=1キー(PoC) |
|---|---|---|
| 7.23.3 | 認証OK | 認証OK+/system resource print実行 — CVE確認 |
| 7.23.4(パッチ済み) | 認証OK | 拒否 |
| 6.49.20 | 認証OK | 拒否(ニュアンス参照) |
| 6.49.21(パッチ済み) | 無効なベースライン | 解釈不能。ゲストがSSH none認証を受け入れ |
7.xペアでは、実キーベースラインは両ビルドで成功、SSH none認証は拒否、誤ったモジュラスの偽造は7.23.3で拒否、正しいモジュラスの偽造は7.23.3でのみ成功。これは有効な脆弱版対パッチ版の比較です。
6.49.21ゲストは独立再検証中に文書化どおりにプロビジョニングされませんでした:adminは期限切れのままで、/user ssh-keys print detailは空で、資格情報なしのSSH noneリクエストがコマンドを実行しました。無関係な実RSAキーと誤ったモジュラスのe=1キーも同様に成功したように見えました。このゲストをパッチ済みコントロールとして使用する前に、再プロビジョニングしてnoneと無関係なキーが拒否されることを確認してください。
バージョンのニュアンス: 6.49.20ではサーバー側のマッチがe=1ブロブを拒否します(/log ssh,debug: can't find matching key for user: admin)— 開示された指数省略は6.xのマッチャーでは観測できませんでしたが、CERTの包括的範囲は[6.0.0, 6.49.21)をリストしています。脆弱性確認済み:7.23.3。パッチ済み確認済み:7.23.4。現在の6.49.21ラボ状態はどちらの結果も証明しません。実地のMikroTrick活動も7.xデバイスを標的にしていました。
ワイヤーフォーマットの発見(RFC 8332): ブロブの内部タイプ文字列はrsa-sha2-256/512署名アルゴリズムでもssh-rsaのままです。署名アルゴリズムは外側のアルゴリズムフィールドにのみ入ります。これを無視すると、サーバーはユーザー認証途中で切断します(ブロブパースエラー)— 6.xと7.xの両方で観測。PoCのForgeKeyはこれを処理し、--exp-enc aligned|canonicalでe=1 mpint幅(1バイト対3バイト)を切り替えます。7.23.3では両方の幅が認証されます — マッチャーは指数をパースし、その値を本当に無視します。6.49.20ではどちらも認証されません(can't find matching key)— 上記のバージョンのニュアンスを参照。サーバー側の/system logging add topics=ssh,debug+/log printパケット16進ダンプがこれらすべてを明らかにしました。
このラボで使用したソースイメージアーカイブのSHA-256値:
a954ab0002a83de5e4c02110f560d0bf622e7d21916088aaacda6baaba88cf4a chr-6.49.20.img.zip
6dcfb8674fa7964bf92ce849fbb0ba8147a5cf3d7a1ba595e24ce3e615569188 chr-6.49.21.img.zip
646764fb0a53e9b5a056cb9cf7420eb1629031096c7268c99fb9216c07f8e98c chr-7.23.3.img.zip
0d32a8da0950dee71e751281c39063f2bebee4b542291aedecc9dbfbe5d60c9d chr-7.23.4.img.zip
login failure for user -2 via ssh、
user <name> added by ssh:-2@<ip>。不明な高権限ユーザーops。
/system/device-mode/printの「Flagged」マーカー(侵害を示すが、その不在は何も証明しない)。観測された攻撃者IP:82.192.72.4、103.102.31.18。