Sebuah layanan yang berjalan lama dapat menyimpan kredensial, material sesi, atau state hasil dekripsi di memori sambil tetap mengandalkan core image untuk diagnosis crash. Menonaktifkan pembuatan core untuk seluruh proses menghilangkan state diagnostik bersama state sensitif. Linux menyediakan kontrol yang lebih sempit: madvise() dengan MADV_DONTDUMP menandai mapping tertentu agar kernel tidak memasukkannya ke core image.
Mekanisme ini mengubah kebijakan penyertaan core dump untuk suatu rentang alamat. Mekanisme tersebut tidak membuat byte tidak dapat diakses oleh proses, mengenkripsinya, menghapusnya, atau membentuk penghalang umum terhadap inspeksi proses. Nilai keamanannya spesifik pada satu jalur paparan data: memori yang tertangkap melalui mekanisme core dump kernel.
Flag melekat pada area memori virtual
madvise(addr, length, MADV_DONTDUMP) menerapkan advice pada page yang mencakup rentang yang diberikan. Linux mencatat kebijakan dump yang dihasilkan pada virtual memory area, yaitu struktur kernel yang mendeskripsikan mapping berurutan dengan properti yang sama.
Alamat harus selaras dengan page, dan rentang yang terdampak ditafsirkan pada granularitas page. Permintaan yang memotong mapping yang sudah ada dapat membuat kernel memecah virtual memory area agar region terpilih membawa kebijakan dump yang berbeda.
long page = sysconf(_SC_PAGESIZE);
void *p = mmap(NULL, page, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (p == MAP_FAILED)
handle_error();
if (madvise(p, page, MADV_DONTDUMP) == -1)
handle_error();Mapping tetap dapat dibaca dan ditulis sesuai protection bit normalnya. MADV_DONTDUMP bukan pengganti mprotect(), kontrol akses, atau isolasi memori.
Pembuatan core memeriksa kebijakan mapping
Core image merepresentasikan state proses terpilih pada titik terminasi. Linux memiliki beberapa kontrol yang memengaruhi apakah core dibuat dan mapping mana yang masuk ke dalamnya. Atribut dumpable proses, resource limit, konfigurasi kernel, routing core, dan coredump_filter per proses berperan pada lapisan yang berbeda.
MADV_DONTDUMP bekerja pada lapisan mapping. Saat kernel menyusun core image, mapping yang membawa flag ini dikecualikan meskipun kebijakan core dump yang lebih luas biasanya akan memasukkan kelas mapping tersebut.
Sifat ini berguna untuk region kecil dengan biaya pengungkapan yang berbeda dari ruang alamat lainnya. Mapping diagnostik dapat tetap memenuhi syarat sementara buffer yang menyimpan material sensitif tidak ikut dimasukkan.
Operasi kebalikannya adalah MADV_DODUMP. Penerapannya pada suatu region menghapus pengecualian MADV_DONTDUMP dan mengembalikan mapping tersebut ke aturan seleksi core normal. Transisi ini dapat dibalik; aplikasi perlu memperlakukan pemanggilan advice berikutnya sebagai bagian dari state keamanan.
Pengecualian bukan penghapusan
Tidak masuknya region ke core image tidak menyatakan apa pun tentang masa hidup byte di memori aktif. Proses tetap dapat membaca region tersebut. Thread lain yang berbagi ruang alamat yang sama tetap dapat mengaksesnya sesuai proteksi mapping. Debugger yang diizinkan atau antarmuka lain dengan kewenangan inspeksi proses yang memadai masih dapat mengakses memori aktif.
Flag ini juga tidak membersihkan page fisik saat mapping dilepas. Kontrol siklus hidup data sensitif memerlukan mekanisme terpisah ketika properti penghapusan diperlukan. MADV_DONTDUMP hanya mengontrol penyertaan dalam output core.
Perbedaan ini mencegah klaim terlalu luas bahwa region DONTDUMP bersifat rahasia. Mekanisme ini mengurangi satu kanal persistensi dan pengungkapan; kerahasiaan tetap bergantung pada batas proses, kebijakan terkait ptrace, kredensial, capability, keputusan Linux Security Module, kebijakan swap dan storage, serta perilaku aplikasi.
Fork membawa state mapping ke child
Atribut virtual memory area diwariskan melalui fork() bersama mapping tempat atribut tersebut berlaku. Child karena itu memulai eksekusi dengan pengecualian dump yang sesuai pada region yang diwarisi.
Pewarisan tersebut dapat berguna ketika parent menyimpan state sensitif sebelum membuat worker. Namun, hal ini juga membentuk asumsi kebijakan yang perlu dilacak secara eksplisit: jika child kemudian melakukan remap data, membuat buffer baru, atau menerapkan MADV_DODUMP, pengecualian awal tidak otomatis mencakup setiap lokasi baru yang memuat byte terkait.
execve() mengganti image memori proses, sehingga program baru membentuk mapping dan kebijakan dump miliknya sendiri. Aplikasi tidak dapat memperlakukan keputusan DONTDUMP sebelum exec sebagai properti persisten dari suatu rahasia logis yang terpisah dari lokasi penyimpanannya.
coredump_filter dan DONTDUMP menangani seleksi yang berbeda
Linux menyediakan /proc/self/coredump_filter untuk memilih kelas mapping, seperti mapping anonymous private atau file-backed, bagi output core. Kontrol tersebut berlaku pada seluruh proses dan berorientasi pada kategori.
MADV_DONTDUMP berorientasi pada rentang. Mekanisme ini dapat membuat pengecualian dari kelas mapping yang secara umum tetap memenuhi syarat. Sebuah layanan dapat mempertahankan memori anonymous private dalam core image sambil mengecualikan buffer anonymous tertentu.
Kedua mekanisme tersebut saling melengkapi. coredump_filter menetapkan kelas penyertaan yang luas; advice per mapping dapat mengeluarkan region tertentu. Tooling operasional yang mengubah kebijakan core pada tingkat proses tidak menjadikan region DONTDUMP sebagai memori dumpable biasa kecuali flag mapping itu sendiri diubah.
Routing core tetap menjadi batas kepercayaan terpisah
Mengecualikan mapping sensitif mengurangi data yang dikirim ke core image, tetapi image yang tersisa masih dapat memuat kredensial, identifier, data request, isi file, fragmen stack, atau state aplikasi dari mapping lain. Penyimpanan dan transport core tetap sensitif terhadap kebijakan keamanan.
Pada sistem yang menyalurkan data core ke collector, collector menjadi bagian dari batas kepercayaan data crash. Permission file, retensi, kompresi, upload, dan alur dukungan dapat memperluas batas tersebut melampaui host tempat proses gagal.
Pengecualian per region paling kuat ketika dipadukan dengan penempatan data yang disengaja. Jika nilai sensitif disalin ke heap umum, stack, cache, dan buffer sementara, penandaan satu alokasi tidak dapat mencakup setiap salinan. Mapping khusus memberi kernel region presisi untuk menerapkan pengecualian.
Batas yang berguna bersifat sempit dan dapat diperiksa
MADV_DONTDUMP menyediakan properti konkret yang ditegakkan kernel: mapping terpilih tidak masuk ke core image Linux selama flag tersebut tetap ada. Properti ini lebih sempit daripada kerahasiaan memori dan lebih sempit daripada status proses yang tidak dumpable.
Batas sempit tersebut bernilai secara operasional. Sebuah layanan dapat mempertahankan sebagian besar diagnostik crash sambil menjaga mapping tertentu di luar artefak core. Jaminan yang dihasilkan bergantung pada penempatan dengan granularitas page, keberadaan flag mapping secara berkelanjutan, dan pengendalian salinan di luar region yang dilindungi. Pengecualian core dengan demikian merupakan properti sebuah mapping, bukan label tahan lama yang melekat pada data itu sendiri.