FlawOpen

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

● CVE-2026-31431 · CVSS 7.8 · Tinggi
Riset Keamanan · FlawOpen

CVE-2026-31431: celah Copy Fail pada kernel Linux

Copy Fail adalah celah eskalasi hak lokal pada jalur AEAD Linux AF_ALG. Optimasi in-place mencampuradukkan pemetaan sumber dan tujuan; perbaikan upstream memulihkan pemrosesan out-of-place, dan CISA memasukkan CVE ini ke KEV.[1], [2], [5]

💡 Penjelasan Sederhana (ELI5)

Bayangkan pustakawan yang harus menandai salinan, tetapi jalan pintas mesin fotokopi membuat pensil menyentuh buku asli. Jalan pintas in-place memungkinkan penulisan untuk hasil mencapai halaman lain yang dipetakan. Perbaikan memproses sumber dan tujuan secara terpisah.[3], [8]

Konsep Kunci & Istilah

AF_ALG
Antarmuka soket Linux untuk permintaan kriptografi dari proses pengguna.[8], [3]
AEAD
Authenticated Encryption with Associated Data: mengenkripsi data dan mengautentikasi metadata tambahan yang tidak dienkripsi.[8]
algif_aead
Implementasi AF_ALG untuk AEAD, termasuk jalur sumber dan tujuan yang rentan.[3]
Page cache
Cache kernel dalam memori untuk konten berkas; penulisan halaman dapat memengaruhi pembacaan sebelum ditulis ke disk.[8]
CWE-1288 / CWE-669
NVD mencantumkan CWE-1288 dengan redhat-SADP sebagai sumber pemetaan; halaman Red Hat juga mencantumkan CWE tersebut. Peringatan Canadian Centre for Cyber Security mengklasifikasikan masalah ini sebagai CWE-669. Keduanya adalah klasifikasi dari sumber berbeda, bukan label yang dapat dipertukarkan.[11], [7], [5], [9], [10]

Pemetaan kerangka kerja

Analisis Akar Masalah (Root Cause)

Perubahan 72548b093ee3 pada 2017 memperkenalkan optimasi in-place di algif_aead. Sumber dan tujuan dapat berasal dari pemetaan berbeda. authencesn dapat menulis data sementara di luar keluaran; scatterlist in-place dapat mengarah ke halaman page cache berkas yang diberikan melalui splice(). Pemberitahuan CVE Linux menjelaskan perbaikan sebagai kembali ke pemrosesan out-of-place sambil mempertahankan penyalinan associated data. Diperlukan akses lokal dan jalur rentan yang aktif. CVSS 7,8 (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H); bukan jalur masuk jarak jauh tanpa autentikasi.[1], [3], [8], [7], [9], [10]

Alur Serangan Langkah demi Langkah

Langkah 1

Proses lokal mencapai API

Proses lokal meminta AEAD melalui AF_ALG dan algif_aead memprosesnya. Permintaan jarak jauh saja tidak mencapai antarmuka lokal ini.[8], [7]

Langkah 2

Jalur memakai optimasi in-place

Implementasi rentan menyusun sumber dan tujuan seolah berbagi halaman dengan aman, meski pemetaannya berbeda.[8], [3]

Langkah 3

Penulisan melewati keluaran

Data sementara authencesn dapat ditulis di luar keluaran dan mencapai halaman cache berkas melalui splice() .[8]

Langkah 4

Kernel memisahkan pemetaan

Perbaikan menghapus kompleksitas in-place, menyalin associated data, lalu memulihkan pemrosesan out-of-place.[1], [3]

Kode Sumber: Rentan vs Aman

Ini ringkasan konseptual, bukan kode kernel verbatim atau patch yang dapat dikompilasi. Pemberitahuan upstream menyebut perbaikan sebagian besar membatalkan 72548b093ee3 sambil mempertahankan penyalinan associated data karena pemetaan berbeda.[3], [2]

Cuplikan sumber: crypto/algif_aead.c (_aead_recvmsg)

IMPLEMENTASI RENTAN
/* Sebelum perbaikan: susun operasi kriptografi secara in-place. */
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);
    /* Bangun dan rangkai scatterlist TX untuk tag autentikasi. */
    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);
PERBAIKAN AMAN & KUAT
/* Setelah perbaikan: pertahankan scatterlist sumber untuk setiap permintaan. */
processed = used + ctx->aead_assoclen;
areq->tsgl_entries = af_alg_count_tsgl(sk, processed);
/* Alokasikan dan inisialisasi areq->tsgl, lalu masukkan halaman TX ke dalamnya. */
af_alg_pull_tsgl(sk, processed, areq->tsgl);
tsgl_src = areq->tsgl;

/* Salin data terkait, tetapi pisahkan sumber dan tujuan. */
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);

Daftar Periksa Penguatan Sistem Rekayasa

Sumber