Esc

    WASM Policy Modules

    Extend authorization logic with sandboxed WebAssembly.

    InferaDB supports sandboxed WebAssembly modules for context-dependent authorization: IP ranges, subscription tiers, time windows, compliance rules.

    How It Works

    1. Export a check() function returning i32
    2. Load the module into InferaDB
    3. Reference it in IPL with module("name")

    Module Contract

    Export a function named check returning i32:

    • Return 0deny
    • Return non-zero → allow

    Example: Simple Allow

    (module
      (func (export "check") (result i32)
        i32.const 1
      )
    )
    

    Example: With Logging

    (module
      (import "host" "log" (func $log (param i32 i32)))
      (memory (export "memory") 1)
      (data (i32.const 0) "checking access")
    
      (func (export "check") (result i32)
        i32.const 0    ;; pointer to string
        i32.const 15   ;; string length
        call $log
        i32.const 1    ;; allow
      )
    )
    

    Using in IPL

    type document {
        relation viewer
        relation access = viewer & module("business_hours")
    }
    

    The user must be a viewer and the WASM module must return allow.

    Host Functions

    Function Signature Description
    host.log (ptr: i32, len: i32) Log a UTF-8 string from module memory

    Execution Context

    Each invocation receives an ExecutionContext:

    Field Example Description
    subject "user:alice" Subject being checked
    resource "document:readme" Resource being accessed
    permission "can_view" Permission being evaluated
    context {...} Optional JSON (IP, time, etc.)

    Sandbox Limits

    Property Default Hard Maximum
    Execution time 100ms 5 seconds
    Memory 10 MB 256 MB
    Fuel (instructions) 1,000,000
    Table elements 1,000
    Instances 1
    WASI Disabled

    Security Model

    Property Guarantee
    No I/O Filesystem, network, and system calls are completely disabled
    Deterministic Fuel-based execution, no access to clocks or randomness
    Memory-safe ResourceLimiter enforces memory caps at runtime
    Isolated Each invocation creates a fresh Store — no shared mutable state
    Auditable Every invocation is traced via OpenTelemetry spans

    Languages

    Any language that compiles to WebAssembly works: Rust (recommended, wasm32-unknown-unknown), AssemblyScript, C/C++ (Emscripten/wasi-sdk), or WAT.

    Limitations

    • Only usable in check operations — expand/list operations return an error
    • check() signature is () -> i32; access context via host functions
    • Module signing and versioning is planned but not yet implemented