WebAssembly ngoài trình duyệt: chạy mã không tin cậy một cách an toàn
Ảnh: GitHub

WebAssembly ngoài trình duyệt: chạy mã không tin cậy một cách an toàn

WebAssembly có hai đặc tính hiếm khi đi cùng nhau: chạy gần tốc độ mã máy, và bị nhốt hoàn toàn không quyền gì mặc định. Chính sự nhốt kín làm nó hữu ích khắp nơi ngoài trình duyệt.

WebAssembly là một định dạng mã nhị phân với hai đặc tính hiếm khi đi cùng nhau: nó chạy gần bằng tốc độ mã máy thật, nó bị nhốt hoàn toàn trong một hộp cát không có bất kỳ quyền gì mặc định. Ra đời để tăng tốc mã trong trình duyệt, nhưng chính đặc tính thứ hai — sự nhốt kín — mới là thứ khiến nó trở nên thú vị ở khắp nơi ngoài trình duyệt.

Vì sao đặc tính thứ hai mới là điều đáng nói

Một mô-đun WebAssembly khởi đầu với đúng vùng nhớ tuyến tính của riêng nó và không gì khác. Không tệp, không mạng, không đồng hồ hệ thống, không biến môi trường — trừ khi môi trường chủ trao cho nó từng năng lực một cách tường minh. Đây là mặc định ngược với gần như mọi cách chạy mã khác: thay vì "có tất cả trừ khi bị cấm", nó là "không có gì trừ khi được cho". Và đó chính xác là thứ bạn cần khi muốn chạy mã do người khác viết mà không tin họ hoàn toàn:

  • Hệ thống plugin: cho người dùng mở rộng phần mềm của bạn mà không phải lo một plugin đọc trộm tệp trên máy hay gửi dữ liệu ra ngoài — nó đơn giản không có quyền để làm thế.
  • Chạy mã ở biên mạng: khởi động dưới một mili giây và nhẹ hơn container rất nhiều, nên chạy được hàng nghìn mô-đun của những khách hàng khác nhau trên cùng một máy mà chúng không thấy được nhau.
  • Nhúng logic của khách hàng vào một dịch vụ nhiều người dùng chung, để mỗi khách tự viết quy tắc riêng mà không đe doạ những khách khác.

Giao diện với hệ thống

Vì bản thân WebAssembly không hề có khái niệm tệp hay socket, cần một chuẩn quy định môi trường chủ cung cấp các năng lực đó ra sao. Chuẩn này xây trên nguyên tắc trao năng lực: mô-đun không mở được thư mục nào ngoài đúng thư mục đã được trao sẵn từ trước, không kết nối được tới địa chỉ nào ngoài những gì được phép. Quyền hạn là thứ được trao từng phần và cụ thể, chứ không phải một công tắc bật/tắt toàn bộ — đó là điều biến hộp cát từ một bức tường thành một cánh cửa có kiểm soát.

Chưa xong chuyện gì

WebAssembly ngoài trình duyệt vẫn đang trưởng thành, và có vài chỗ gồ ghề thật. Gọi qua lại giữa mô-đun và môi trường chủ vẫn tốn kém khi phải truyền những cấu trúc dữ liệu phức tạp — dữ liệu phải được sao chép hoặc mã hoá qua ranh giới, không truyền thẳng con trỏ được. Hỗ trợ đa luồng và thu gom rác còn đang hoàn thiện. Và những ngôn ngữ có bộ chạy nặng thì biên dịch ra mô-đun khá lớn, làm mất một phần lợi thế khởi động nhanh.

Nguyên tắc chọn gọn lại thành một câu: dùng WebAssembly khi bài toán của bạn là "chạy mã tôi không tin một cách an toàn", chứ không phải khi bạn chỉ cần thêm hiệu năng. Nếu vấn đề thuần tuý là tốc độ, thường có những cách đơn giản hơn nhiều; sức mạnh riêng của WebAssembly nằm ở sự cách ly, và đó là nơi nên chọn nó.

Chia sẻ

Thảo luận