Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
KindaRails2Shell — Rails CVE-2026-66066 向けシングルファイル PoC:任意ファイル読み取り、シークレットの復元、スレッド化スキャン、および署名付き画像バリエーションによる条件付き RCE。 | Kitploit
ツール/GitHubGitHub/0xsha/kindarails2shell
脆弱性スキャナーエクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテストペイロード開発ラボと実践
GitHub0xsha/kindarails2shell

KindaRails2Shell

Rails CVE-2026-66066 向けシングルファイル PoC:任意ファイル読み取り、シークレットの復元、スレッド化スキャン、および署名付き画像バリエーションによる条件付き RCE。

リポジトリを見る
2220日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

KindaRails2Shell: CVE-2026-66066

Rails Active Storage/libvips の任意ファイル読み取り脆弱性に対する、依存関係ゼロ・単一ファイルの概念実証(PoC)と、ループバックのみの Docker ラボです。また、アドバイザリに記載された、回収した secret_key_base から偽造した画像バリエーションとコマンド実行への条件付き昇格も実演します。

  • 影響を受けるバージョン: Rails 7.2.0–7.2.3.1、8.0.0–8.0.5、8.1.0–8.1.3
  • 修正済みバージョン: Rails 7.2.3.2、8.0.5.1、8.1.3.1
  • 実行環境: Python 3.11+(標準ライブラリのみ)
  • 対象範囲: 認可されたテストおよびローカル調査

主な参照先: Rails アドバイザリ、 Rails フォレンジック分析、 Ethiack 技術解説、 および 8.1.3.1 リリース。

デモ

https://github.com/user-attachments/assets/fdcb5651-c1d1-4bc4-b322-8f1205b09635

この PoC が役立つ理由

kr2s.py には完全なクライアントが 1 つのファイルに含まれています:

  • h5py や numpy を必要としない、埋め込み可能でパッチ可能な HDF5/MAT ペイロード
  • ダイレクトアップロード配信と自動 CSRF 処理
  • 既存の Active Storage サムネイルからのバリエーションキー収集
  • バイト単位で正確な復元のための、厳格で標準ライブラリのみの PNG デコーダ
  • リクエストあたり最大 16 MiB の任意オフセット読み取り
  • シークレットの発見と、純 Python による Rails バリエーション署名
  • ランダムマーカーとベストエフォートなクリーンアップによるコマンド出力の読み戻し
  • JSON レポートを伴う、スレッド化された受動的または明示的に能動的なスキャン
  • プロキシ、カスタムパス、TLS、タイムアウト、ユーザーエージェントの制御

このツールはパッケージのインストール、コールバックリスナーの起動、ターゲット上の curl の要求、make への依存を行いません。RCE ステージは組み込みの Active Storage representation ルートを使用し、Marshal ガジェットを必要としません。

クイックスタート

脆弱なラボを起動します:

root@kitploit:~
cd lab
RAILS_VERSION=8.1.3 docker compose up --build

Compose のポートは 127.0.0.1 にバインドされ、コンテナはすべての Linux ケーパビリティを落とした非特権ユーザーとして実行されます。

別のターミナルで:

root@kitploit:~
# Intrusive: uploads a blob, then confirms /etc/hostname is readable.
python3 kr2s.py check http://127.0.0.1:3000

# Recover a fixed-size prefix. Binary output goes to stdout unless -o is used.
python3 kr2s.py read http://127.0.0.1:3000 /etc/passwd --size 4096
python3 kr2s.py read http://127.0.0.1:3000 /etc/passwd -o passwd.bin

# Recover selected environment secrets. Values are redacted by default.
python3 kr2s.py secrets http://127.0.0.1:3000

# Display complete matched environment values for authorized analysis.
python3 kr2s.py secrets http://127.0.0.1:3000 --show-full

# Passive preflight of one target or a file containing one target per line.
python3 kr2s.py scan http://127.0.0.1:3000
python3 kr2s.py scan targets.txt --threads 10 --json scan.json

# Intrusively confirm file read on every target in the list.
python3 kr2s.py scan targets.txt --active

# Probe selected libvips loaders.
python3 kr2s.py probe http://127.0.0.1:3000

# Conditional escalation. This executes the supplied command.
python3 kr2s.py rce http://127.0.0.1:3000 "id; uname -a"

すべての上書きオプションについては python3 kr2s.py COMMAND --help を実行してください。実アプリケーションで一般的な制御オプションには、--harvest-url、--show-path、--proxy、--insecure、--skb があります。

secrets --show-full は、一致した環境変数の値を完全に表示します。これを指定しない場合、ツールは最初の 12 文字と省略記号のみを表示します。--also-read で要求されたファイル(デフォルトの Rails クレデンシャルパスを含む)は、読み取り可能な場合に最大 600 文字まで表示されます。

受動的な scan は、ページが収集可能な Active Storage 表現を公開しているかどうかのみを報告し、インストールされている Rails のパッチレベルを特定することはできません。scan --active は悪意のある blob をアップロードし、カナリア読み取りを試みます。能動スキャンの失敗結果は、WAF、認証、未対応のバリエーション、Rails の修正がアプリケーション外部からは同一に見える可能性があるため、SAFE ではなく BLOCKED_OR_INCONCLUSIVE とラベル付けされます。

ラボを停止するには:

root@kitploit:~
cd lab
docker compose down

エクスプロイトの動作

  1. クライアントは image/png として宣言された Active Storage ダイレクトアップロードを予約します。
  2. ハイブリッド MATLAB/HDF5 ファイルをアップロードします。HDF5 データセットは外部ストレージを使用し、そのファイル名とオフセットが Rails プロセス内のファイルを指します。
  3. 既存のサムネイルからサーバー署名付きバリエーションキーを収集し、悪意のある blob の署名付き ID とともに再利用します。
  4. 脆弱な Rails はデータを libvips の matload に渡します。ターゲットファイルのバイト列は画像ピクセルになり、生成された PNG として返されます。
  5. クライアントは PNG を検証・デコードし、matio の列優先(column-major)レイアウトを逆算して元のバイト列を復元します。

このハイブリッドファイルは 2 つのパーサーを同時に満たします。テキストは MATLAB 5.0 で始まり、オフセット 124 のバージョンワードが HDF5 ベースの MATLAB 7.3 パスを選択します。Rails の修正は、攻撃者が制御するファイルが matload に到達する前に、信頼できないとマークされた libvips 操作をブロックします。

条件付き RCE

rce は、--skb が指定されない限り、まず /proc/self/environ から SECRET_KEY_BASE を読み取ります。次に Active Storage の verifier キーを導出し、instance_eval 操作を含む JSON バリエーションに署名します。影響を受ける vips パスでは、この操作は Vips::Image.public_send に到達します。PoC はこれを組み込みの representation ルート経由で送信し、指定されたコマンドを /bin/sh で実行し、両方の出力ストリームをキャプチャします。

この第 2 ステージは、署名シークレットの回収と、CVE-2025-24293 に関する Ethiack の分析に記載された脆弱な vips 変換動作への到達が条件となります。CVE-2026-66066 のパッチはファイル読み取りのエントリポイントを閉じますが、以前に漏えいした署名シークレットに対する一般的な修正ではありません。Rails アドバイザリが推奨しているように、漏えいが疑われる場合はシークレットをローテーションしてください。

コマンド出力はランダムな /tmp/.kr2s_* ファイルに書き込まれ、同じファイル読み取りプリミティブを通じて回収された後、2 つ目の署名済みペイロードで削除されます。

読み取りの動作と制限

読み取りは、要求された固定サイズの領域を返します。ソースがそれより短い場合は、そのプレフィックスの後にゼロバイトが続きます。後続の領域には --offset を使用します。

デフォルトのラボのバリエーションは PNG に変換するだけなので、復元はバイト単位で正確です。実際のアプリケーションではバリエーションをリサイズする場合があります。収集キーモードは水平方向のリサンプリングを避けるために 1 ピクセルの列を使用しますが、高さが小さいバリエーションではジオメトリが変わる可能性があります。その場合、クライアントは明示的に失敗します。--size を減らすか、リサイズしない表現を収集してください。

すべてのコマンドは侵入的です。永続的な Active Storage blob を作成し、処理済みバリエーションを作成する可能性があります。rce はさらに、指定されたコマンドを実行します。

バージョンマトリクス

マトリクススクリプトは各リリースをビルドし、脆弱なバージョンで実際の読み取りと RCE チェックを実行し、修正済みバージョンで読み取りがブロックされることを検証し、不一致があれば非ゼロを返します:

root@kitploit:~
./lab/matrix.sh
./lab/matrix.sh 8.1.3
./lab/matrix.sh 8.1.3.1:PATCHED

2026-07-31 に Ruby 3.4.10、image_processing 1.14.0、ruby-vips 2.3.0、libvips 8.16.1 で検証済み:

修正済みの行では、事前に提供された署名シークレットを使った RCE ペイロードを意図的に実行しません。マトリクスは CVE のファイル読み取り境界をテストします。

研究用ユーティリティ

research/craft.py は、ローダー研究用の候補ペイロードを再生成し、h5py と numpy を必要とします。これはリリース版 PoC からはインポートされません。lab/probe/probe.sh は、ラボイメージ内の ruby-vips を使ってこれらの候補を検査します:

root@kitploit:~
uv run --script research/craft.py all -o /tmp/kr2s-payloads
docker run --rm \
  -v "$PWD/lab/probe:/probe:ro" \
  -v /tmp/kr2s-payloads:/payloads:ro \
  --entrypoint /probe/probe.sh kr2s-rails:8.1.3

依存関係のないユニットテストを実行するには:

root@kitploit:~
python3 -m unittest discover -s tests -v

公開された成果物の由来

MAT/HDF5 ペイロードと依存関係のないクライアントは、ローカルテストを通じて開発されました。公開 PoC が登場した後、このリリースには Zer0SumGam3 の PoC で文書化されたバリエーションキー収集と組み込みの Active Storage ルートが組み込まれました。ここでの Python 実装はオリジナルであり、標準ライブラリのみを使用しています。

初期のリビジョンでは、Puma::MiniSSL::Context と ActiveSupport プロキシを使用した署名付き Marshal ペイロードでも RCE が可能であることを実証していました。これは Behrad Taher の公開ガジェット研究 に基づいています。その方法はターゲット側のヘルパーバイナリを回避しましたが、Marshal 対応の署名付き ID シンクに加えて、読み込まれた Puma と ActiveSupport のガジェットクラスが必要でした。Ethiack リサーチチームが、よりシンプルな署名付き JSON バリエーション手法を文書化した KindaRails2Shell 技術解説 を公開した後、この方法は置き換えられました。この手法は標準のルートを使用し、それらの前提条件を排除します。

発見の功績は André Baptista (0xacb)、Bruno Mendes (s3np41k1r1t0)、Rafael Castilho と Ethiack リサーチチーム、RyotaK (GMO Flatt Security) に帰属します。Abdelmounaim Moulahcene (bl0rph) は、調整された開示の直前に基盤となるプリミティブを独自に公開しました。メンテナーの完全なタイムラインとクレジットについては、Rails フォレンジックリポジトリを参照してください。

責任ある使用とライセンス

所有しているシステム、または明示的にテストを許可されたシステムでのみ使用してください。作者は誤用に対する責任を負いません。この研究アーティファクトの問題を報告するには、SECURITY.md を参照してください。

MIT ライセンス の下で公開されています。

ツールをダウンロード
Railsファイル読み取りRCE チェック結果
7.2.3.1READ-OKRCE-OK合格
7.2.3.2ブロック未実行合格
8.0.5READ-OKRCE-OK合格
8.0.5.1ブロック未実行合格
8.1.3READ-OKRCE-OK合格
8.1.3.1ブロック未実行合格