Mencegah serangan rantaian bekalan kepada ekosistem JavaScript

Patricia Arquette
Lepaskan: 2024-10-25 13:19:30
asal
626 orang telah melayarinya

Preventing supply-chain attacks to the JavaScript ecosystem

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.

Masalah: Kebenaran warisan

Berikut ialah insiden baru-baru ini di mana tapak web digodam:

  • Penyelidik memautkan serangan rantaian bekalan Polyfill ke rangkaian besar tapak perjudian peniru

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.

? Cara tapak web dipengaruhi

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.

? Cara aplikasi JavaScript di luar penyemak imbas dipengaruhi

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:

  • Walaupun sistem kebenaran seperti Deno dikuatkuasakan, mereka membenarkan modul JS untuk mewarisi kebenaran pemanggil tanpa sekatan. Ini bermakna jika aplikasi mempunyai kebenaran menulis penuh, maka pengesah alamat e-mel yang tidak sepatutnya mempunyai akses kepada mana-mana sumber kecuali sumber pengiraan boleh memadamkan fail pengguna tanpa diketahui oleh pengguna OS.
  • Aplikasi selalunya dijalankan dengan keistimewaan penuh pengguna OS. Sebagai contoh, untuk kod yang dilaksanakan di bawah alat seperti MDRB, pada masa ini tidak boleh mengehadkan kebenaran kepada kod yang sedang dijalankan.

Penyelesaian semasa

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:

  • Mengimbas semua versi semua modul yang diketahui yang diterbitkan adalah sangat intensif sumber.
  • Tiada jaminan bahawa semua modul yang tersedia di alam liar telah diimbas.

? Penyelesaian: Kebenaran setiap modul

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:

  • permissions.self — Di sinilah aplikasi atau modul mengisytiharkan kebenaran yang diperlukan olehnya dan kebergantungannya.
  • permissions.imports — Di sinilah aplikasi atau modul mengisytiharkan kebenaran yang ia bersetuju untuk diperuntukkan kepada kebergantungannya. Ini ialah superset kebenaran yang dibenarkan oleh setiap kebergantungan.

Begini cara kebenaran akan digunakan oleh masa jalan JS/TS:

  • Apabila aplikasi atau modul mengimport modul M, masa jalan menyemak sama ada keizinan M.self berada dalam had yang dikenakan pengimport pada M. Import melemparkan ralat (cth. PermissionError) jika ini tidak berlaku.
  • Ralat masa jalan juga dilemparkan (cth. PermissionError) apabila modul atau aplikasi cuba melakukan sesuatu yang tidak dibenarkan untuk dilakukan. Ralat masa jalan ini boleh ditangkap dan dikendalikan tanpa membatalkan aplikasi.

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": []}
    }
  }
}
Salin selepas log masuk

Berbanding dengan penyelesaian semasa, penyelesaian yang saya cadangkan mempunyai beberapa kelebihan:

  • Ringan — Modul yang diterbitkan tidak perlu diimbas.
  • Teliti — Kebenaran dikuatkuasakan pada masa jalankan, jadi jika enjin JS/TS yang betul digunakan, modul yang tidak diketahui pun tidak boleh jatuh melalui retakan.

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!