flawopen.com/Incidents/windows-update-stack-symlink-eop-september-2026
CVE-2026-81963: tautan Windows Update
CVE-2026-81963 adalah celah tautan Windows Update yang telah dieksploitasi. Lihat versi terdampak, patch, dan cara aman membuka berkas.[1], [2]
Seorang penjaga malam dengan kunci induk mengantar paket ke "gudang di ujung lorong", mengikuti panah di dinding tanpa memeriksa ke ruangan mana ia masuk. Penghuni boleh memindahkan panah itu. Salah satunya memutar panah gudang agar mengarah ke ruang manajer, dan penjaga, yang kuncinya membuka setiap pintu, masuk dan meletakkan paket di meja manajer. Penghuni itu tak akan pernah bisa membuka pintu tersebut; kunci penjagalah yang membukanya. Perbaikannya: penjaga membaca nomor pintu yang benar-benar ia buka, dan berhenti mengikuti panah yang bisa dipindahkan penghuni.[5], [9]
Konsep Kunci & Istilah
Windows Update Stack- Komponen Windows yang memindai, mengunduh, menyiapkan, dan memasang pembaruan. Semuanya berjalan sebagai SYSTEM karena memasang pembaruan berarti menulis ke bagian sistem operasi yang dilindungi.[1]
SYSTEM (NT AUTHORITY\SYSTEM)- Akun lokal tempat layanan Windows berjalan. Di komputer lokal haknya lebih besar daripada administrator, sehingga operasi berkasnya nyaris tak pernah ditolak.[1]
Junction / symbolic link (reparse point)- Objek NTFS yang membuat satu jalur teresolusi ke lokasi lain. Pengguna standar dapat membuat junction di folder yang ia kendalikan dan mengalihkan nama folder itu ke direktori yang tak bisa ia tulisi.[9]
Link-following (CWE-59)- Program membuka, menulis, memindahkan, atau menghapus berkas berdasarkan nama tanpa memeriksa bahwa nama itu teresolusi ke tempat yang diharapkan, sehingga tautan yang ditanam orang lain mengalihkan operasinya.[5], [2]
FILE_FLAG_OPEN_REPARSE_POINT- Flag CreateFileW yang membuka komponen path terakhir itu sendiri jika berupa reparse point, bukan mengikuti tautan terakhir tersebut. Flag ini sendiri tidak mencegah pemrosesan reparse point pada komponen path sebelumnya.[6]
TOCTOU (CWE-367)- Time-of-check to time-of-use: sistem berkas berubah antara pemeriksaan dan operasi yang bergantung padanya. Memeriksa string jalur lalu membukanya berdasarkan nama meninggalkan celah waktu itu.[12]
CWE-284 (Kontrol Akses yang Tidak Tepat)- Microsoft menetapkan
CWE-59danCWE-284untuk CVE ini.CWE-59menunjukkan kelemahan resolusi tautan yang spesifik.CWE-284adalah Pillar CWE yang luas dan secara tegas tidak disarankan MITRE untuk memetakan kerentanan di dunia nyata. Perlakukan sebagai klasifikasi Microsoft yang lebih luas atas masalah yang sama, bukan bukti adanya bug kedua.[2], [11], [5]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-59 CWE-284
- CISA KEV — ditambahkan 2026-09-08 — CVE-2026-81963
Kronologi Insiden
Microsoft mencadangkan CVE-2026-81963.[2]
Patch Tuesday September: Microsoft merilis perbaikan dan menandai celah sebagai "Exploitation Detected" serta belum diumumkan ke publik.[1]
CISA menambahkan CVE-2026-81963 ke katalog Known Exploited Vulnerabilities, dengan tenggat perbaikan 22 September 2026 bagi lembaga federal AS.[4]
Microsoft menerbitkan revisi dari advisory tersebut.[1]
Alur Serangan Langkah demi Langkah
Layanan SYSTEM bekerja di jalur yang bisa diubah pengguna
Komponen Update Stack berjalan sebagai SYSTEM dan menangani berkas di direktori penyiapan dan kerja. Jika pengguna standar dapat membuat, menghapus, atau mengganti nama entri di mana pun sepanjang jalur itu, dialah yang menentukan ke mana jalur teresolusi. Microsoft tidak menyebut jalur mana yang terdampak kali ini.[1]
Layanan mengikuti tautan
Windows biasanya memproses reparse point saat membuka path. FILE_FLAG_OPEN_REPARSE_POINT berlaku pada komponen terakhir; komponen sebelumnya masih dapat di-resolve. Jika layanan kemudian menulis melalui path yang belum divalidasi, pemeriksaan akses menggunakan token SYSTEM milik layanan. Validasi handle direktori dan buat file anak relatif terhadap handle tersebut.[6], [8]
Kode Sumber: Rentan vs Aman
Microsoft belum menerbitkan fungsi yang terdampak maupun patch-nya. Contoh pertahanan ini bukan kode Microsoft. Pemeriksaan pemilik saja tidak memadai: kepemilikan objek tidak membuktikan bahwa DACL-nya menolak akses tulis bagi pengguna standar. Pola ini mengasumsikan installer membuat path staging tetap beserta semua direktori induknya dengan DACL eksplisit yang hanya mengizinkan SYSTEM dan Administrators menulis. Fungsi ini tidak membaca atau memvalidasi DACL; izin yang disiapkan installer merupakan prasyarat deployment. Pola ini memvalidasi handle direktori yang sudah dibuka, lalu membuat satu nama file relatif terhadap handle tersebut dengan NtCreateFile dan FILE_CREATE; path gabungan tidak dibuka ulang. Uji DACL dan perilaku sistem berkas pada deployment yang didukung. Pasang pembaruan Microsoft untuk memperbaiki CVE-2026-81963.[5], [6], [7], [8], [9], [10]
Cuplikan sumber: Contoh ilustrasi penanganan path Windows; bukan kode sumber Microsoft
/* Contoh ilustratif, bukan kode sumber Microsoft: fungsi yang terdampak belum
* dipublikasikan. Layanan SYSTEM menulis file ke direktori staging yang dapat diubah
* pengguna biasa.
*/
BOOL WriteStagedFile(LPCWSTR stagingDir, LPCWSTR name,
const BYTE *data, DWORD size)
{
WCHAR path[MAX_PATH];
if (FAILED(StringCchPrintfW(path, MAX_PATH, L"%s\\%s", stagingDir, name)))
return FALSE;
/* CWE-59: CreateFileW menyelesaikan junction dan symlink pada setiap komponen
* jalur; pemeriksaan akses menggunakan token SYSTEM. Jika pengguna mengganti
* stagingDir dengan junction, penulisan akan menuju target junction.
*/
HANDLE h = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE)
return FALSE;
DWORD written = 0;
BOOL ok = WriteFile(h, data, size, &written, NULL) && written == size;
CloseHandle(h);
return ok;
}/* Pola pertahanan ilustratif, bukan kode sumber atau patch Microsoft. Installer harus
* membuat jalur ini beserta semua direktori induknya dengan DACL eksplisit yang hanya
* mengizinkan SYSTEM dan Administrators menulis.
*/
#include <windows.h>
#include <winternl.h>
static const WCHAR STAGING_DIR[] =
L"C:\\ProgramData\\Vendor\\Update\\Staging";
BOOL WriteStagedFile(LPCWSTR name, const BYTE *data, DWORD size)
{
if (name == NULL || data == NULL || name[0] == L'\0' ||
wcspbrk(name, L"\\/:") != NULL || wcscmp(name, L".") == 0 ||
wcscmp(name, L"..") == 0)
return FALSE;
/* Pin objek direktori; tanpa FILE_SHARE_DELETE, penggantian nama akan terhalang. */
HANDLE dir = CreateFileW(STAGING_DIR,
FILE_LIST_DIRECTORY | FILE_TRAVERSE | FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OPEN_REPARSE_POINT,
NULL);
if (dir == INVALID_HANDLE_VALUE)
return FALSE;
FILE_ATTRIBUTE_TAG_INFO tag;
WCHAR actual[MAX_PATH];
BOOL ok = FALSE;
DWORD n;
if (!GetFileInformationByHandleEx(dir, FileAttributeTagInfo,
&tag, sizeof tag) ||
(tag.FileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
goto done;
n = GetFinalPathNameByHandleW(dir, actual, MAX_PATH,
FILE_NAME_NORMALIZED | VOLUME_NAME_DOS);
if (n == 0 || n >= MAX_PATH ||
_wcsicmp(actual, L"\\\\?\\C:\\ProgramData\\Vendor\\Update\\Staging") != 0)
goto done;
/* Buka anak baru relatif terhadap handle ini, jangan membangun ulang jalur. */
size_t nameChars = wcslen(name);
if (nameChars == 0 || nameChars > 255)
goto done;
USHORT nameBytes = (USHORT)(nameChars * sizeof(WCHAR));
UNICODE_STRING relativeName = { nameBytes, nameBytes, (PWSTR)name };
OBJECT_ATTRIBUTES oa = {0};
oa.Length = sizeof oa;
oa.RootDirectory = dir;
oa.ObjectName = &relativeName;
oa.Attributes = OBJ_CASE_INSENSITIVE;
IO_STATUS_BLOCK iosb = {0};
HANDLE file = INVALID_HANDLE_VALUE;
NTSTATUS status = NtCreateFile(
&file, FILE_WRITE_DATA | SYNCHRONIZE, &oa, &iosb, NULL,
FILE_ATTRIBUTE_NORMAL, 0, FILE_CREATE,
FILE_NON_DIRECTORY_FILE | FILE_OPEN_REPARSE_POINT, NULL, 0);
if (!NT_SUCCESS(status))
goto done; /* FILE_CREATE gagal jika entri sudah ada. */
DWORD written = 0;
ok = WriteFile(file, data, size, &written, NULL) && written == size;
CloseHandle(file);
done:
CloseHandle(dir);
return ok;
}Daftar Periksa Penguatan Sistem Rekayasa
- ✓Pasang pembaruan kumulatif September 2026: KB5124008 (Windows 11 24H2 dan 25H2), KB5122880 (23H2), KB5124012 (26H1), atau KB5122871 (Server 2025). Build yang sudah diperbaiki adalah 10.0.26100.9445, 10.0.26200.9445, 10.0.22631.7582, 10.0.28000.2954, dan untuk Server 2025 10.0.26100.33438.[1]
- ✓Di setiap layanan yang berjalan sebagai SYSTEM atau administrator, daftar semua panggilan CreateFileW, DeleteFileW, MoveFileExW, CopyFileW, dan SetFileSecurityW yang jalurnya berada di %ProgramData%, %TEMP%, C:\Users, atau lokasi lain yang dapat ditulisi pengguna, dan wajibkan tinjauan untuk masing-masing.
- ✓Buka direktori dengan FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, tolak yang berflag FILE_ATTRIBUTE_REPARSE_POINT, dan pertahankan handle tetap terbuka tanpa FILE_SHARE_DELETE selama bekerja di dalamnya.[6], [9]
- ✓Konfirmasikan target dengan GetFinalPathNameByHandleW pada handle yang terbuka sebelum menulis; jangan pernah memercayai string jalur yang Anda susun sendiri.[7]
- ✓Gunakan CREATE_NEW (atau FILE_CREATE pada NtCreateFile) alih-alih CREATE_ALWAYS di direktori bersama, agar berkas atau tautan yang sudah ada membuat operasi gagal, bukan tertimpa.[8]
- ✓Buat direktori kerja layanan dengan DACL eksplisit yang memberi hak tulis hanya kepada SYSTEM dan Administrators, dan gagalkan pengujian installer jika icacls menunjukkan hak tulis untuk Users atau Authenticated Users.[10]
- ✓Saat layanan melakukan operasi berkas atas nama pemanggil, tirukan pemanggil itu (RpcImpersonateClient, ImpersonateNamedPipeClient) agar akses diperiksa terhadap tokennya, bukan token SYSTEM.
- ✓Beri peringatan saat proses pengguna standar membuat junction atau mount point di bawah %ProgramData% atau %windir%; hal ini jarang pada pemakaian normal dan begitulah serangan link-following bermula.
- ✓Buat file anak relatif terhadap handle direktori yang sudah diverifikasi dengan
NtCreateFiledanFILE_CREATE; jangan buka ulangstagingDir\namemelalui path gabungan setelah direktori diperiksa.[8]
Sumber
- Microsoft Security Response Center — CVE-2026-81963, peningkatan hak istimewa di Windows Update Stack
- CVE-2026-81963 — catatan CVE
- NVD — CVE-2026-81963
- CISA — katalog Known Exploited Vulnerabilities
- MITRE CWE-59: resolusi tautan yang keliru sebelum akses berkas
- Microsoft Learn — CreateFileW
- Microsoft Learn — GetFinalPathNameByHandleW
- Microsoft Learn — NtCreateFile (directory-relative names)
- Microsoft Learn — Reparse points and file operations
- Microsoft Learn — GetSecurityInfo (owner and DACL)
- MITRE CWE-284: Improper Access Control
- MITRE CWE-367: Time-of-check Time-of-use (TOCTOU) Race Condition