ข้ามไปยังเนื้อหา

WASI Deep Dive

WASI ไม่ได้แค่เปิดเผย system call — แต่ออกแบบใหม่ว่าโปรแกรมจะได้รับสิทธิ์เข้าถึงทรัพยากรระบบ แทนที่โมเดล POSIX ซึ่งโปรเซสสืบทอด ambient authority จาก user ID, WASI ใช้ capability-based security: module สามารถใช้ทรัพยากรได้เฉพาะเมื่อรันไทม์ส่ง capability มาให้อย่างชัดเจน

ในโปรเซส Unix ทั่วไป การเปิด /etc/passwd สำเร็จตราบใดที่ UID ของโปรเซสมีสิทธิ์อ่าน ไม่มี sandboxing ที่ขอบเขตแอปพลิเคชัน

ใน WASI module ไม่มี ambient access เลย รันไทม์ทำหน้าที่เป็นยาม:

  • เพื่ออ่านจาก filesystem host ต้องส่ง pre-opened directory file descriptor ผ่าน --dir
  • เพื่อเข้าถึง environment variable host ต้องอนุญาตผ่าน --env
  • โดยค่าเริ่มต้น module WASI มีสิทธิ์เข้าถึง filesystem ศูนย์, network ศูนย์ และ environment variable ศูนย์

ซึ่งหมายความว่าคุณสามารถรัน binary .wasm ที่ไม่น่าเชื่อถือได้อย่างปลอดภัย สิ่งเลวร้ายที่สุดที่ module ที่ถูก compromise สามารถทำได้ถูกจำกัดเฉพาะสิ่งที่ได้รับมาเท่านั้น

WASI ผ่านการแก้ไขหลักสองครั้ง:

Preview 1 (0.1)Preview 2 (0.2)
สถานะStable, รองรับอย่างกว้างขวางStable ตั้งแต่ต้นปี 2024
สไตล์ interfaceC-like imports แบบ flat (fd_write, path_open)Component Model WIT interface
Target triplewasm32-wasi / wasm32-wasip1wasm32-wasip2
Networkingไม่อยู่ใน core (vendor extension)wasi:sockets อยู่ใน core
ToolchainRust stable, WASI SDKcargo component, wasm-tools

สำหรับงาน production ส่วนใหญ่ในปัจจุบัน Preview 1 (wasm32-wasip1) คือค่าเริ่มต้นที่ปลอดภัย Preview 2 คืออนาคต และ tooling กำลังพัฒนาอย่างรวดเร็ว

เพิ่ม target หนึ่งครั้ง แล้ว build ตามปกติ:

Terminal window
# ติดตั้ง WASI target
rustup target add wasm32-wasip1
# Build release binary
cargo build --target wasm32-wasip1 --release
# Output: target/wasm32-wasip1/release/my_app.wasm

main.rs ของ Rust ขั้นต่ำสำหรับ WASI:

fn main() {
println!("Hello from WASI!");
let args: Vec<String> = std::env::args().collect();
println!("Args: {:?}", args);
}

println! map ไปยัง WASI fd_write import บน file descriptor 1 (stdout) std::env::args() ใช้ WASI args_get / args_sizes_get imports ทั้งคู่เป็นส่วนหนึ่งของ Preview 1

เมื่อ wasmtime (หรือรันไทม์ WASI ใด ๆ) รัน binary .wasm จะมองหา exported function ชื่อ _start นี่คือเทียบเท่า WASI ของ main()

Rust compiler สร้าง _start อัตโนมัติเมื่อคอมไพล์ด้วย main function และ target wasm32-wasip1 คุณสามารถตรวจสอบด้วย wasm-objdump:

Terminal window
wasm-objdump -x target/wasm32-wasip1/release/my_app.wasm | grep export
# ...
# - func[N] <_start> -> "_start"
flowchart TD
  RT["wasmtime / wasmer\n(runtime)"]
  subgraph "Capability grants"
    D["--dir /data\n(pre-opened fd)"]
    E["--env KEY=VAL"]
    A["argv via --"]
  end
  RT -->|"pre-opens"| D
  RT -->|"injects"| E
  RT -->|"passes"| A
  D --> M["Wasm Module\n(_start)"]
  E --> M
  A --> M
Capability grants ไหลเข้า module เมื่อ startup
ตัวเลือกBenefitCost
WASI capability-based securityปลอดภัยกว่า POSIX ambient authority มาก — module ใช้ได้เฉพาะทรัพยากรที่ runtime ส่งมาให้อย่างชัดเจนเท่านั้นยังไม่ compatible กับ POSIX เต็มรูปแบบ native library จำนวนมากที่ assume ambient filesystem/network access จะ port เข้า WASI ไม่ราบรื่น
Server-side Wasm (WASI runtime) vs containerCold-start ระดับ microsecond เหมาะกับงาน edge/serverless ที่ต้อง spin up บ่อยContainer ecosystem ยังมี tooling, orchestration และ library support ที่ mature และครบกว่ามาก
  • คาดหวังว่า filesystem หรือ network จะ “ใช้งานได้เลย” เหมือนโปรแกรม native ทั่วไป โดยไม่ grant capability ผ่าน --dir หรือ --env อย่างชัดเจน — module จะ fail แบบเงียบ ๆ หรือโยน permission error
  • คิดว่า WASI Preview 1 compatible กับ POSIX API เต็มรูปแบบ แล้วพยายาม port native library ที่ assume ambient access ตรง ๆ โดยไม่ปรับ
  • ไม่ track ว่า Preview 2 และ Component Model ยังเป็น standard ที่พัฒนาอยู่ — วางแผน production บน wasm32-wasip2 วันนี้อาจต้องรับมือกับ breaking change ของ interface ในอนาคต

💡 ตัวอย่างจากของจริง

Fastly Compute@Edge รัน untrusted customer code เป็น Wasm module พร้อม capability sandboxing แบบ WASI บนเครือข่าย edge ของตัวเอง ทำให้แต่ละ request ได้ sandbox ที่ปลอดภัยโดยไม่ต้องพึ่ง container isolation

ใน WASI โมดูลจะได้รับสิทธิ์เข้าถึง directory บน host filesystem อย่างไร?
Rust target triple ใดที่คอมไพล์ไป WASI Preview 1?
Entry-point function ของ WASI ที่รันไทม์มองหาคืออะไร?
ข้อได้เปรียบด้านความปลอดภัยหลักของ WASI capability-based security เทียบกับ POSIX ambient authority คืออะไร?