Serangan rantaian bekalan merupakan masalah besar bagi ekosistem JavaScript. Dalam catatan ringkas ini saya akan menggariskan langkah keselamatan yang mudah yang boleh dilaksanakan oleh semua masa jalan JavaScript, kedua-dua dalam penyemak imbas dan luar penyemak imbas. Ini akan menghalang kebanyakan serangan rantaian bekalan yang melanda ekosistem JavaScript hari ini.
Berikut ialah insiden baru-baru ini di mana tapak web digodam:
Inti masalahnya ialah Modul JavaScript mewarisi kebenaran aplikasi atau modul yang telah memanggilnya. Ini adalah masalah untuk masa jalan dalam penyemak imbas dan masa jalan luar penyemak imbas.
Masalah ini lebih rumit kerana versi modul yang bergantung pada aplikasi boleh berubah tanpa diketahui oleh pengarang aplikasi. Jadi, walaupun kod semua kebergantungan telah disemak dengan teliti (yang merupakan usaha yang besar itu sendiri), usaha ini akan sia-sia jika versi kebergantungan tidak dikunci.
Mengapa tidak mengunci versi dan menggunakan kebergantungan berasaskan semver? Ini adalah terutamanya kerana jika penerbit modul menerbitkan pembetulan pepijat, lebih baik menggunakan kod tetap. Dan ini adalah satu sebab besar mengapa CDN JavaScript seperti esm.sh menyokong semvers.
Pelayar web ialah persekitaran pelaksanaan kotak pasir, jadi modul JavaScript pihak ketiga (3JM) yang diimport oleh tapak web tidak boleh menyebabkan sebarang kerosakan pada peranti pengguna akhir.
Walau bagaimanapun, 3JM boleh menggunakan sumber pengiraan peranti dan mengeluarkan permintaan rangkaian untuk perlombongan Bitcoin dll, tanpa kebenaran tapak web.
Sesetengah masa jalan luar penyemak imbas seperti Deno melaksanakan langkah untuk menyekat kebenaran yang diberikan kepada aplikasi JavaScript/TypeScript. Tetapi langkah-langkah ini gagal kerana sebab-sebab berikut:
Pada masa ini, pasukan keselamatan telah menyediakan proses automatik untuk mencari kelemahan dalam modul yang diterbitkan pada pendaftaran terkenal seperti NPM. Langkah keselamatan ini mempunyai beberapa kelemahan:
Untuk menyelesaikan isu ini, saya mencadangkan sistem kebenaran setiap modul baharu yang serasi ke belakang dengan cara aplikasi JS/TS berfungsi pada masa ini.
Ini melibatkan konfigurasi kebenaran pilihan baharu yang boleh diisytiharkan oleh setiap aplikasi dan modul dalam fail deno.json / deno.jsonc / package.json mereka. kebenaran mempunyai 2 bahagian:
Begini cara kebenaran akan digunakan oleh masa jalan JS/TS:
Nilai kebenaran adalah seperti ini:
{ "self": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "imports": { "jsr:@org/module@1.0.0": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "https://cdn.example/org/module@1.0.0": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "[default]": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} } } }
Berbanding dengan penyelesaian semasa, penyelesaian yang saya cadangkan mempunyai beberapa kelebihan:
Ini nampaknya sangat mudah. Tiada pengubahsuaian diperlukan kepada bahasa JS/TS. Dan jika konfigurasi kebenaran tiada, maka kita kembali kepada situasi semasa di mana aplikasi dan graf pergantungannya semuanya mempunyai kebenaran yang disediakan oleh argumen baris perintah ∎
Atas ialah kandungan terperinci Mencegah serangan rantaian bekalan kepada ekosistem JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!