FlawOpen

flawopen.com/Incidents/windows-update-stack-symlink-eop-september-2026

● Microsoft · CVE-2026-81963 · September 2026 · CVSS 7.8 · Tinggi
Riset Keamanan · FlawOpen

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]

💡 Penjelasan Sederhana (ELI5)

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-59 dan CWE-284 untuk CVE ini. CWE-59 menunjukkan kelemahan resolusi tautan yang spesifik. CWE-284 adalah 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

Kronologi Insiden

2026-08-27

Microsoft mencadangkan CVE-2026-81963.[2]

2026-09-08

Patch Tuesday September: Microsoft merilis perbaikan dan menandai celah sebagai "Exploitation Detected" serta belum diumumkan ke publik.[1]

2026-09-08

CISA menambahkan CVE-2026-81963 ke katalog Known Exploited Vulnerabilities, dengan tenggat perbaikan 22 September 2026 bagi lembaga federal AS.[4]

2026-09-15

Microsoft menerbitkan revisi dari advisory tersebut.[1]

Alur Serangan Langkah demi Langkah

Langkah 1

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]

Langkah 2

Jalur dialihkan

Junction atau symbolic link membuat nama direktori teresolusi ke tempat lain, misalnya folder sistem yang dilindungi. Membuat junction di folder yang dikendalikan pengguna tidak memerlukan hak administrator.[5], [9]

Langkah 3

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]

Langkah 4

Lokasi yang dilindungi diubah

Layanan membuat, menimpa, memindahkan, atau menghapus berkas di tempat yang seharusnya hanya dikendalikan SYSTEM atau administrator. FAQ Microsoft menegaskan bahwa eksploitasi memberi penyerang hak SYSTEM.[1], [2]

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

IMPLEMENTASI RENTAN
/* 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;
}
PERBAIKAN AMAN & KUAT
/* 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

Sumber