Membuat Pemrosesan

Untuk sistem file, sebagian besar pekerjaan keamanan yang menarik terjadi selama pemrosesan IRP_MJ_CREATE. Langkah inilah yang harus menganalisis permintaan masuk, menentukan apakah pemanggil memiliki hak yang sesuai untuk melakukan operasi, dan memberikan atau menolak operasi sebagaimana mestinya. Untungnya, untuk pengembang sistem file, sebagian besar mekanisme keputusan diterapkan dalam Monitor Referensi Keamanan. Dengan demikian, dalam kebanyakan kasus, sistem file hanya perlu memanggil rutinitas Monitor Referensi Keamanan yang sesuai untuk menentukan akses dengan benar. Risiko untuk sistem file terjadi ketika gagal memanggil rutinitas ini seperlunya dan secara tidak pantas memberikan akses ke pemanggil.

Untuk sistem file standar, seperti sistem file FAT, pemeriksaan yang dibuat sebagai bagian dari IRP_MJ_CREATE terutama pemeriksaan semantik. Misalnya, sistem file FAT memiliki banyak pemeriksaan untuk memastikan bahwa pemrosesan IRP_MJ_CREATE diizinkan berdasarkan status file atau direktori. Pemeriksaan yang dilakukan oleh sistem file FAT ini mencakup pemeriksaan untuk media baca-saja (misalnya, upaya untuk melakukan operasi "buat" yang merusak, seperti menimpa atau menggantikan, pada media baca-saja tidak diizinkan), pemeriksaan akses berbagi, dan pemeriksaan oplock. Salah satu bagian paling sulit dari analisis ini adalah menyadari bahwa operasi pada satu tingkat (tingkat file, misalnya) sebenarnya mungkin tidak diizinkan karena status sumber daya tingkat yang berbeda (tingkat volume, misalnya). Misalnya, file mungkin tidak dibuka jika proses lain secara eksklusif mengunci volume tersebut. Kasus umum yang harus diperiksa meliputi:

  • Apakah tingkat keterbukaan file kompatibel dengan kondisi tingkat volume? Penguncian tingkat volume harus dipatuhi. Dengan demikian, jika satu proses memegang kunci tingkat volume eksklusif, hanya utas dalam proses tersebut yang dapat membuka file. Thread dari proses lain tidak boleh diizinkan untuk membuka file.

  • Apakah tingkat file terbuka kompatibel dengan status media? Operasi "buat" tertentu memodifikasi file sebagai bagian dari operasi "buat". Ini akan mencakup mengganti, menggantikan, dan bahkan memperbarui waktu akses terakhir pada file. Operasi "buat" ini tidak diizinkan pada media baca-saja dan waktu akses terakhir tidak diperbarui.

  • Apakah tingkat volume terbuka kompatibel dengan status tingkat file? Pembukaan eksklusif volume tidak akan diizinkan jika ada file yang sedang dibuka di volume tersebut. Ini adalah masalah umum bagi pengembang baru karena mereka mencoba membuka volume dan menemukan bahwa itu gagal. Ketika ini gagal, FSCTL_DISMOUNT_VOLUME dapat digunakan untuk membatalkan handle terbuka dan memaksa pelepasan, memungkinkan akses eksklusif ke volume yang baru saja dipasang.

Selain itu, atribut file harus kompatibel. File dengan atribut baca-saja tidak dapat dibuka untuk akses tulis. Perhatikan bahwa akses yang diinginkan harus diperiksa setelah hak generik diperluas. Misalnya, pemeriksaan ini pada sistem file FASTFAT ada dalam fungsi FatCheckFileAccess (lihat file sumber Acchksup.c dari sampel fastfat yang disediakan WDK).

Contoh kode berikut khusus untuk semantik FAT. Sistem file yang mengimplementasikan DACL juga, akan melakukan pemeriksaan keamanan tambahan menggunakan rutinitas Monitor Referensi Keamanan (SeAccessCheck, misalnya.)

    //
    //  check for a read-only Dirent
    //

    if (FlagOn(DirentAttributes, FAT_DIRENT_ATTR_READ_ONLY)) {

        //
        //  Check the desired access for a read-only Dirent
        // Don't allow 
        //  WRITE, FILE_APPEND_DATA, FILE_ADD_FILE,
        //  FILE_ADD_SUBDIRECTORY, and FILE_DELETE_CHILD
        //

        if (FlagOn(*DesiredAccess, ~(DELETE |
                                     READ_CONTROL |
                                     WRITE_OWNER |
                                     WRITE_DAC |
                                     SYNCHRONIZE |
                                     ACCESS_SYSTEM_SECURITY |
                                     FILE_READ_DATA |
                                     FILE_READ_EA |
                                     FILE_WRITE_EA |
                                     FILE_READ_ATTRIBUTES |
                                     FILE_WRITE_ATTRIBUTES |
                                     FILE_EXECUTE |
                                     FILE_LIST_DIRECTORY |
                                     FILE_TRAVERSE))) {

            DebugTrace(0, Dbg, "Cannot open readonly\n", 0);

            try_return( Result = FALSE );
        }

Pemeriksaan yang lebih halus yang diterapkan oleh FASTFAT adalah untuk memastikan bahwa akses yang diminta oleh pemanggil adalah sesuatu yang diketahui sistem file FAT (dalam fungsi FatCheckFileAccess di Acchksup.c dari sampel fastfat yang dikandung WDK):

Contoh kode berikut menunjukkan konsep penting untuk keamanan sistem file. Periksa untuk memastikan bahwa apa yang diteruskan ke sistem file Anda tidak berada di luar batas apa yang Anda harapkan. Pendekatan konservatif dan tepat dari perspektif keamanan adalah bahwa jika Anda tidak memahami permintaan akses, Anda harus menolak permintaan tersebut.

    //
    // Check the desired access for the object. 
    // Reject what we do not understand.
    // The model of file systems using ACLs is that
    // they do not type the ACL to the object that the 
    // ACL is on. 
    // Permissions are not checked for consistency vs.
    // the object type - dir/file.
    //

    if (FlagOn(*DesiredAccess, ~(DELETE |
                                 READ_CONTROL |
                                 WRITE_OWNER |
                                 WRITE_DAC |
                                 SYNCHRONIZE |
                                 ACCESS_SYSTEM_SECURITY |
                                 FILE_WRITE_DATA |
                                 FILE_READ_EA |
                                 FILE_WRITE_EA |
                                 FILE_READ_ATTRIBUTES |
                                 FILE_WRITE_ATTRIBUTES |
                                 FILE_LIST_DIRECTORY |
                                 FILE_TRAVERSE |
                                 FILE_DELETE_CHILD |
                                 FILE_APPEND_DATA))) {

        DebugTrace(0, Dbg, "Cannot open object\n", 0);

        try_return( Result = FALSE );
    }

Untungnya untuk sistem file, setelah pemeriksaan keamanan dilakukan selama pemrosesan pembuatan awal, pemeriksaan keamanan berikutnya dilakukan oleh manajer I/O. Jadi, misalnya, manajer I/O memastikan bahwa aplikasi mode pengguna tidak melakukan operasi tulis terhadap file yang telah dibuka hanya untuk akses baca. Bahkan, sistem file tidak boleh mencoba memberlakukan semantik baca-saja terhadap objek file, bahkan jika dibuka hanya untuk akses baca, selama rutinitas pengiriman IRP_MJ_WRITE. Hal ini disebabkan oleh cara manajer memori mengaitkan objek file tertentu dengan objek bagian tertentu. Penulisan berikutnya melalui bagian tersebut akan dikirim sebagai operasi IRP_MJ_WRITE pada objek file, meskipun file tersebut dibuka dalam mode baca-saja. Dengan kata lain, penegakan akses dilakukan ketika file handle dikonversi menjadi objek file yang sesuai di titik masuk layanan sistem Nt oleh ObReferenceObjectByHandle.

Ada dua lokasi tambahan dalam sebuah sistem berkas di mana pemeriksaan keamanan semantik harus dilakukan mirip dengan pemrosesan "pembuatan".

  • Selama penggantian nama atau pemrosesan tautan keras.

  • Saat memproses operasi kontrol sistem file.

Pemrosesan penggantian nama dan pemrosesan kontrol sistem file dibahas di bagian berikutnya.

Perhatikan bahwa ini bukan daftar lengkap masalah semantik yang terkait dengan pemrosesan "buat". Niat dari bagian ini adalah untuk menarik perhatian pada masalah ini untuk pengembang sistem file. Semua masalah semantik harus diidentifikasi untuk sistem file tertentu, diimplementasikan untuk memenuhi semantik tertentu, dan diuji untuk memastikan bahwa implementasi menangani berbagai kasus.