FlawOpen

flawopen.com/Teardowns/cve-2026-31431-linux-algif-aead-copy-fail

● CVE-2026-31431 · CVSS 7.8 · 高
セキュリティ研究 · FlawOpen

CVE-2026-31431:Linux カーネルの Copy Fail

Copy Fail は Linux AF_ALG の AEAD 経路にあるローカル権限昇格の脆弱性です。in-place 最適化が送信元と宛先のマッピングを混同し、上流修正は out-of-place 処理に戻しました。CISA は CVE を KEV に掲載しています。[1], [2], [5]

💡 わかりやすい解説 (ELI5)

図書館員がコピーに印を付けるはずなのに、機械の近道で鉛筆が原本に届く状況を想像してください。in-place の近道により結果用の書き込みが別のマッピング済みページに届く可能性がありました。修正は送信元と宛先を分けます。[3], [8]

主要な概念と専門用語

AF_ALG
ユーザープロセスが暗号処理を要求する Linux ソケットインターフェース。[8], [3]
AEAD
関連データ付き認証暗号:データを暗号化し、追加の非暗号化メタデータを認証します。[8]
algif_aead
AEAD 用 AF_ALG 実装で、脆弱な送信元・宛先処理経路を含みます。[3]
Page cache
ファイル内容のカーネルメモリキャッシュ。ページへの書き込みはディスク書き戻し前の読み取りにも影響します。[8]
CWE-1288 / CWE-669
NVD は redhat-SADP をマッピング元として CWE-1288 を掲載し、Red Hat のページにも同じ CWE が記載されています。カナダ・サイバーセキュリティセンターの警告は、この問題を CWE-669 に分類しています。これらは別々の情報源による分類であり、互換のラベルではありません。[11], [7], [5], [9], [10]

フレームワーク対応

根本原因の分析 (Root Cause)

2017 年の変更 72548b093ee3 は algif_aead に in-place 最適化を導入しました。送信元と宛先は異なるマッピングの場合があります。authencesn は一時データを出力領域の外へ書き込み、in-place scatterlist により splice() で渡されたファイルのページキャッシュへ届く可能性がありました。Linux の CVE 通知は関連データのコピーを残しつつ out-of-place 処理へ戻す修正を説明しています。ローカルアクセスと脆弱経路の有効化が必要です。CVSS 7.8(AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)で、未認証のリモート侵入経路ではありません。[1], [3], [8], [7], [9], [10]

ステップ・バイ・ステップの攻撃フロー

ステップ 1

ローカルプロセスが API に到達

ローカルプロセスが AF_ALG 経由で AEAD を要求し、algif_aead に処理が渡ります。リモート要求だけではこのローカル API に到達しません。[8], [7]

ステップ 2

経路が in-place 最適化を使用

実装はマッピングが異なるにもかかわらず、送信元と宛先が同じページを共有できるかのように扱います。[8], [3]

ステップ 3

書き込みが出力範囲を越える

authencesn の一時データ処理が出力範囲外へ書き込み、splice() で渡されたファイルのキャッシュページに届く可能性があります。[8]

ステップ 4

カーネルがマッピングを分離

修正は不要な in-place 処理をなくし、関連データをコピーして out-of-place 処理に戻します。[1], [3]

ソースコード比較:脆弱 vs 堅牢化

概念の要約であり、カーネルの逐語的なコードやコンパイル可能なパッチではありません。上流通知によると修正は 72548b093ee3 をほぼ戻し、異なるマッピングに対応するため関連データのコピーを残します。[3], [2]

ソース抜粋: crypto/algif_aead.c (_aead_recvmsg)

脆弱な実装
/* 修正前: 暗号処理を同じバッファ上で実行する。 */
rsgl_src = areq->first_rsgl.sgl.sg;

if (ctx->enc) {
    memcpy_sglist(areq->first_rsgl.sgl.sg, tsgl_src, processed);
    af_alg_pull_tsgl(sk, processed, NULL, 0);
} else {
    memcpy_sglist(areq->first_rsgl.sgl.sg, tsgl_src, outlen);
    /* 認証タグ用の TX scatterlist を構築して連結する。 */
    areq->tsgl_entries = af_alg_count_tsgl(sk, processed, processed - as);
    /* ... */
}

aead_request_set_crypt(&areq->cra_u.aead_req, rsgl_src,
                       areq->first_rsgl.sgl.sg, used, ctx->iv);
堅牢化されたセキュアパッチ
/* 修正後: リクエストごとのソース scatterlist を保持する。 */
processed = used + ctx->aead_assoclen;
areq->tsgl_entries = af_alg_count_tsgl(sk, processed);
/* areq->tsgl を割り当てて初期化し、TX ページをそこへ追加する。 */
af_alg_pull_tsgl(sk, processed, areq->tsgl);
tsgl_src = areq->tsgl;

/* 関連データをコピーしつつ、ソースと宛先は分離しておく。 */
rsgl_src = areq->first_rsgl.sgl.sg;
memcpy_sglist(rsgl_src, tsgl_src, ctx->aead_assoclen);
aead_request_set_crypt(&areq->cra_u.aead_req, tsgl_src,
                       areq->first_rsgl.sgl.sg, used, ctx->iv);

エンジニアリング&システム堅牢化チェックリスト

参考資料