Harap membuat bahasa Anda dapat dianalisis / diaudit untuk petugas keamanan komputer.
Orang-orang keamanan harus dapat menemukan kerentanan dalam suatu program sebelum dikirimkan. Idealnya, kami dipanggil lebih awal dan dapat mengomentari basis kode saat itu berkembang, tetapi seringkali tidak.
Ketika versi baru dari bahasa atau pustaka inti keluar, hal-hal yang sebelumnya aman mungkin tidak lagi:
- perpustakaan mungkin menjadi lebih kuat: mis. perpustakaan URL sekarang mendukung
javascript:
- mungkin ada cara baru untuk mengubah string atau byte menjadi kode: mis.
eval
atau deserialization libraries
- teknik refleksi bahasa dapat menjadi lebih kuat: misalnya mengekspos variabel lokal
Setiap perubahan ini dapat meningkatkan jumlah otoritas yang dapat disalahgunakan oleh suatu program, tetapi karena jumlah kewenangan yang digunakan oleh program (ketika berhadapan dengan klien yang tidak jahat) belum berubah, petugas keamanan sulit sekali menemukan jawabannya tanpa intensif audit ulang.
Jadi, tolong pikirkan tentang kami saat merancang dan membuat versi bahasa. Berikut adalah beberapa tips:
Tetapkan beberapa primitif bahwa suatu program dapat diuraikan menjadi.
HTML5 sangat buruk dengan cara ini. Mereka jelas telah menaruh banyak pemikiran dalam keamanan dan memiliki beberapa orang yang sangat pintar, tetapi alih-alih menspesifikasikan elemen program baru seperti <video>
dalam hal yang lama, atau membuat abstraksi umum yang baru <video>
dan lama <img>
keduanya dapat ditentukan dalam hal,<video>
belum elemen program satu kali lainnya dengan konsekuensi keamanannya sendiri.
Jadikan bahasa Anda setuju dengan analisis statis (meskipun tidak diketik secara statis).
Orang-orang keamanan sering menggunakan analisis statis untuk menemukan pola, dan untuk mencoba dan mengesampingkan bagian-bagian dari suatu program sehingga mereka dapat fokus pada bit yang benar-benar rumit.
Harus jelas pengidentifikasi mana yang merupakan variabel lokal dan mana yang tidak.
Misalnya, jangan membuat kesalahan yang sama dengan JavaScript versi lama yang membuatnya tidak mungkin untuk mengetahui apakah x
ada referensi variabel lokal di bawah ini (menurut pembacaan literal dari versi lama spec):
if (Math.random() > 0.5) {
Object.prototype.x = 0;
}
function f() {
var x = 1;
(function () {
alert(x); // Might alert 0, might alert 1.
})();
}
Izinkan keamanan terurai
Banyak sistem yang aman dirancang di sekitar kernel yang aman yang menjaga properti keamanan, sehingga rakyat keamanan dapat memfokuskan upaya mereka pada menganalisis sejumlah kecil kode dan membebaskan sebagian besar programmer dari harus berurusan dengan rakyat keamanan {annoying, pedantic, paranoid} security .
Seharusnya dimungkinkan untuk menulis kernel seperti itu dalam bahasa Anda. Jika salah satu properti keamanan bahasa Anda, apakah hanya sebagian URL saja yang akan diambil, dapatkah penulis kernel melakukan sesuatu untuk menyalurkan semua URL yang mengambil kode mereka? Atau dapatkah pemeriksaan build statis (seperti melihat impor) melayani fungsi yang sama.
Beberapa bahasa seperti Newspeak menggunakan model kemampuan objek. Itu luar biasa dan cara yang bagus untuk mendapatkan keamanan yang terurai.
Tetapi jika Anda tidak dapat melakukan itu, membuat grafik modul menjadi artefak yang dapat dianalisis secara statis dapat memberi Anda cukup banyak manfaat. Jika saya dapat membuktikan bahwa suatu modul tidak dapat mencapai modul I / O file (kecuali dengan memanggil kode dalam sebuah modul di TCB), maka saya dapat mengesampingkan seluruh kelas masalah dari modul itu.
Batasi otoritas bahasa skrip tertanam
Banyak sistem yang berguna diatur sebagai inti statis yang memulai banyak kode yang ditulis dalam bahasa yang dinamis (bahkan fungsional).
Dan menanamkan bahasa skrip dapat membuat sistem menjadi lebih mudah dikembangkan.
Tetapi bahasa scripting seharusnya tidak memiliki otoritas penuh VM.
Jika Anda memilih untuk mengizinkan bahasa skrip tertanam, buat yang mudah bagi invoker untuk membatasi apa yang dapat mereka lakukan. Model kemampuan-objek (lihat komentar di Newspeak di atas) sangat sesuai di sini; jadi ketika mengevaluasi kode dalam bahasa scripting, pemanggil harus meneruskan kode untuk mengeksekusi dan semua variabel global untuk kode itu.
Perlakukan eval
sebagai bahasa yang menyematkan dirinya sebagai bahasa scripting
Jika bahasa Anda dapat memanggil kompilernya sendiri untuk mengubah string menjadi kode, maka izinkanlah untuk di-sandbox sama seperti Anda menggunakan bahasa skrip tertanam apa pun.
Gunakan model konkurensi sederhana
Kami petugas keamanan tidak suka harus khawatir tentang kondisi lomba ketika mencoba mencari tahu apakah properti keamanan dikelola.
Harap pertimbangkan alternatif untuk threading sebelum menetapkan utas sebagai opsi default yang hampir mustahil untuk diamankan.
Salah satu yang sederhana adalah event loop concurrency seperti yang ditemukan di E, Verilog, dan JavaScript.
Jangan mendorong mengutip kebingungan
Beberapa bahasa adalah bahasa lem, dan mereka akhirnya berurusan dengan string dalam banyak bahasa yang berbeda.
Sebagai contoh, JavaScript sering menyusun string HTML, CSS, XML, JSON, dan bahkan JavaScript. Sangat sulit bagi pemrogram untuk mengingat untuk menyandikan string teks biasa dengan benar ketika menggabungkan mereka untuk membuat string dalam bahasa lain, sehingga program JS, tidak mengejutkan, memiliki semua jenis masalah kebingungan mengutip: XSS adalah yang terburuk.
Jika Anda ingin memasukkan fitur komposisi string, cobalah untuk mengurangi beban keamanan programmer. DSL, makro higienis, dan bahasa templat yang disematkan dapat menjadi cara yang bagus untuk melakukan ini dengan memindahkan beban untuk melarikan diri dengan benar ke pengembang perpustakaan atau bahasa dan jauh dari pengembang akhir.