[HN Gopher] Extism makes WebAssembly easy
       ___________________________________________________________________
        
       Extism makes WebAssembly easy
        
       Author : wikiwong
       Score  : 123 points
       Date   : 2023-10-03 13:01 UTC (1 days ago)
        
 (HTM) web link (dylibso.com)
 (TXT) w3m dump (dylibso.com)
        
       | simonw wrote:
       | The thing I want to achieve with WebAssembly is still proving a
       | lot harder than I had anticipated.
       | 
       | I want to be able to take strings of untrusted code provided by
       | users and execute them in a safe sandbox.
       | 
       | I have all sorts of things I want this for - think custom
       | templates for a web application, custom workflow automation
       | scripts (Zapier-style), running transformations against JSON
       | data.
       | 
       | When you're dealing with untrusted code you need a really robust
       | sandbox. WebAssembly really should be that sandbox.
       | 
       | I'd like to support Python, JavaScript and maybe other languages
       | too. I want to take a user-provided string of code in one of
       | those languages and execute that in a sandbox with a strict limit
       | on both memory usage and time taken (so I can't be crashed by a
       | "while True" loop). If memory or time limit are exceeded, I want
       | to get an exception which I can catch and return an error message
       | to the user.
       | 
       | I've been exploring options for this for quite a while now. The
       | furthest I've got was running Python in wasmtime:
       | https://til.simonwillison.net/webassembly/python-in-a-wasm-s...
       | and running Pyodide inside of Deno:
       | https://til.simonwillison.net/deno/pyodide-sandbox
       | 
       | Surprisingly I've not found a good pattern for running a
       | JavaScript interpreter in a WASM sandbox yet.
       | https://github.com/justjake/quickjs-emscripten looks promising
       | but I've not found the right recipe to call it from server-side
       | Python or Deno yet.
       | 
       | Can Extism help with this? I'm confident I'm not the only person
       | who's looking for a solution here!
        
         | bhelx wrote:
         | Hey Simon, I've done some similar experimentation using Extism
         | to sandbox LLM generated code. This uses our JavaScript PDK
         | (which uses quickjs) and can be embedded in any host language
         | we support https://extism.org/blog/sandboxing-llm-generated-
         | code
         | 
         | I'm also working on a Python-PDK right now and hope to have a
         | beta ready in the next month. That would allow us to do
         | something similar with python.
        
           | simonw wrote:
           | Sandboxing code generated by LLMs is another of my use-cases
           | for this, that's a fantastic link, thanks!
        
             | bhelx wrote:
             | I think I referenced one of your blog post in that article
             | too. So thank you!
        
         | richarme wrote:
         | I'm building something that solves this exact problem, and I'll
         | have an alpha version ready soon. Drop me a mail at marc@ my
         | username .net, if you're interested. I'd also really like to
         | have a chat about your use cases if you're up for it.
         | 
         | Cheers, Marc
        
         | phickey wrote:
         | To run a JavaScript interpreter (spidermonkey, in this case) in
         | Wasm, as well as running that same wasm in a JS engine, you
         | want to look at `jco` https://github.com/bytecodealliance/jco
         | 
         | The component model tooling is getting very close to maturity
         | and will solve many of these problems.
        
           | simonw wrote:
           | That's really useful. This page in particular:
           | https://github.com/bytecodealliance/jco/blob/main/EXAMPLE.md
           | 
           | Being able to run "jco wit cowsay.wasm" to see what
           | interfaces that .wasm file provides solves a problem I've run
           | into a bunch of times in the past.
        
             | nilslice wrote:
             | you should also check out modsurfer[0]
             | 
             | "modsurfer generate -p cowsay.wasm -o mod.yaml"
             | 
             | Especially for non-component core modules that wont have
             | wit definitions
             | 
             | [0]: https://github.com/dylibso/modsurfer
        
         | joel_dice wrote:
         | I created https://github.com/dicej/component-sandbox-demo when
         | you asked about this on the Bytecode Alliance Zulip. Curious if
         | you have any feedback on it.
        
         | diogenes4 wrote:
         | > I want to be able to take strings of untrusted code provided
         | by users and execute them in a safe sandbox.
         | 
         | Isn't this the entire pitch of the browser as an app platform
         | rather than a document viewer? Why target it if it's not
         | sandboxed?
        
         | mikewarot wrote:
         | >When you're dealing with untrusted code you need a really
         | robust sandbox. WebAssembly really should be that sandbox.
         | 
         | We shouldn't have to trust _any_ code. WASM is a stepping stone
         | out of the insanity that is ambient authority.
        
         | benno128 wrote:
         | I'm working on this problem as well and would be happy to sling
         | you some thoughts and notes. Check my website https://runno.dev
         | and send an email to the address on that website!
        
       | segphault wrote:
       | The idea of Wasm as a universal plugin system is very promising.
       | But string passing is maybe not the best example to highlight,
       | considering that Wasm is introducing stringref to enable zero-
       | copy string sharing between the Wasm runtime and host language.
       | 
       | https://github.com/WebAssembly/stringref/blob/main/proposals...
        
         | davexunit wrote:
         | I'm working on a WASM project[0] with Andy, the stringref
         | champion, and unfortunately the future for stringref is
         | uncertain. There is now a new proposed alternative called "JS
         | string builtins"[1]. The way we intend to ship support for
         | strings currently is to just use JS string builtins, because it
         | is just a set of imported functions, not new instructions.
         | Those imports can either be provided by efficient, native
         | compiled functions (currently behind a V8 feature flag, not
         | sure if other JS engines support it) or from a JS polyfill.
         | It's not an ideal situation but this will allow for shipping
         | strings that work in all browsers with default settings.
         | 
         | [0] https://gitlab.com/spritely/guile-hoot
         | 
         | [1] https://github.com/WebAssembly/js-string-
         | builtins/blob/main/...
        
         | Deukhoofd wrote:
         | While it'd be a nice addition, I wouldn't expect it any time
         | soon.
         | 
         | It's currently still a stage 1 proposal, while we've been
         | waiting for years for other proposals to be merged. The last
         | time a proposal was actually finished was over 2 years ago.
         | 
         | https://github.com/WebAssembly/proposals
         | 
         | https://github.com/WebAssembly/proposals/blob/main/finished-...
        
           | vouwfietsman wrote:
           | Indeed, webassembly is moving extremely slowly. I started a
           | project years ago expecting
           | https://github.com/WebAssembly/memory-
           | control/blob/main/prop... and
           | https://github.com/WebAssembly/memory64 to be fixed at some
           | point. Neither are yet, and the project still suffers from it
           | to this day.
           | 
           | I think wasm is still great without these fixes, but I have
           | lost confidence in the idea that wasm will reach its full
           | potential any time soon.
        
             | pjmlp wrote:
             | Eventually people will realise its potential is being yet
             | another bytecode format, with VC trying to capitalise
             | products on top of it.
        
               | vmfunction wrote:
               | Assembly is not bytecode! V8 already has bytecode for the
               | web. WASM is meant to run faster and more efficient
               | computations.
        
               | pjmlp wrote:
               | Dude first learn what you are talking about.
               | 
               | > WebAssembly (abbreviated Wasm) is a binary instruction
               | format for a stack-based virtual machine. Wasm is
               | designed as a portable compilation target for programming
               | languages, enabling deployment on the web for client and
               | server applications.
               | 
               | https://webassembly.org/
        
             | chrisco255 wrote:
             | https://github.com/WebAssembly/memory64/blob/main/proposals
             | /...
             | 
             | For your second one, it looks like it is already
             | implemented in Chromium and Firefox but not Safari. Sadly,
             | it's not new for Apple to be dragging their feet on moving
             | web standards forward.
             | 
             | It took what seems like a decade to get proper WebRTC
             | support in Safari.
        
         | pjmlp wrote:
         | A quite old idea,
         | 
         | https://en.m.wikipedia.org/wiki/UNCOL
        
         | conaclos wrote:
         | Thanks for sharing!
         | 
         | This is the first time I saw a mention of WTF-8 [1] and WTF-16.
         | From the spec description this seems strange to use this
         | interoperability "hack" (using the word from the spec) as the
         | foundation of the string proposal. I wonder if they could use
         | UTF-8 instead and keep WTF-16 for interoperability with
         | JavaScript.
         | 
         | > WTF-8 [...] is a superset of UTF-8 that encodes surrogate
         | code points if they are not in a pair. It represents, in a way
         | compatible with UTF-8, text from systems such as JavaScript and
         | Windows that use UTF-16 internally but don't enforce the well-
         | formedness invariant that surrogates must be paired. WTF-8 is a
         | hack intended to be used internally in self-contained systems
         | with components that need to support potentially ill-formed
         | UTF-16 for legacy reasons.
         | 
         | [1] https://simonsapin.github.io/wtf-8/
        
       | ramesh31 wrote:
       | This is an ad. Just use WASI.
        
         | nilslice wrote:
         | WASI is great and obviously Extism supports it as a superset of
         | functionality - but you don't always want to give your guest
         | code access to system resources even in a limited environment.
         | 
         | Extism also offers a bunch of other features that you don't get
         | with WASI. But use what's best suited for your needs!
        
         | simonw wrote:
         | "Just" use WASI is not useful advice. I've been trying to do
         | that for my own purposes for over a year. The learning curve on
         | that (as a Python programmer who wants to use WebAssembly for
         | sandboxing) is practically a vertical wall.
        
           | ramesh31 wrote:
           | I should have said "Just use any WASI compliant runtime".
           | There's a ton of them with these features, and none of the
           | commercial angle.
        
         | xmonkee wrote:
         | Can you link to a similar example using WASI?
        
           | ramesh31 wrote:
           | Take your pick of runtimes. Wasmtime is the most popular
           | right now.
           | 
           | https://github.com/bytecodealliance/wasmtime/blob/main/docs/.
           | ..
        
             | xmonkee wrote:
             | Thanks. I'm not sure how this maps to the original example,
             | though. This is about compiling a standalone program which
             | translates POSIX apis, it seems? How about calling it from
             | Rust with string args etc?
        
               | brabel wrote:
               | Exactly. That's what Extism is trying to solve. That WASI
               | post doesn't show at all how to use the WASM code from C,
               | or vice versa, because it just compiles the entire C
               | program to WASM which uses the POSIX-based WASI API. If
               | you want an alternative to Extism, you need something
               | like wasmer.io, not just wasmtime (Extism actually uses
               | wasmtime as mentioned in the post).
        
               | ramesh31 wrote:
               | Right. The point being that you can take your pick of
               | WASI compliant runtimes which have those features. Extism
               | isn't something special compared to any other open source
               | project in this domain, yet it smells of a commercial
               | venture. Count me out.
        
         | VyseofArcadia wrote:
         | Claiming to make a thing that is already easy easy is a whole
         | business model.
        
       | lisowski wrote:
       | If you want to hear more about extism we did an interview with
       | them https://www.devtools.fm/episode/58
        
         | nilslice wrote:
         | thanks for having us on!
        
       | yebyen wrote:
       | This blog article is great, I had a hell of a time integrating
       | Wasm into Ruby, so much so to the point that I gave up.
       | 
       | I was absolutely going to call a function, pass it some HTML to
       | parse (as a string), and return a number, but what I wound up
       | doing is pass a directory with some HTML file in it, return a
       | number as a string, and parse it. Because after struggling with
       | wasmtime and wasmer until I could see it was not going to perform
       | acceptably with a Ruby interpreter packed into the Wasm module, I
       | found that further, it was seemingly impossible to call a
       | function from in Ruby with any meaningful parameters without
       | going through the system interface to the Wasm.
       | 
       | https://youtu.be/EsAuJmHYWgI?list=PLbzoR-pLrL6prBc8UnTQ9wI3B...
       | 
       | and
       | 
       | https://youtu.be/EsAuJmHYWgI?list=PLbzoR-pLrL6prBc8UnTQ9wI3B...
       | 
       | The article does a much better job of explaining these issues
       | concretely, but if you're totally lost, you can hear my fever-
       | dream version of the same ideas here. (I am a Wasm beginner.)
       | 
       | But if you don't have time to watch, tl;dr: I gave up, my Wasm in
       | the end was called as a WASI, which I passed a filesystem context
       | into rather than attempt to call any function at all, and I
       | parsed the output from the system interface. Not too different
       | than what it looks like the Extism example is doing. I will
       | definitely be going through these docs as it seems likely to help
       | me understand better what I've missed, and moreover that it has
       | Ruby support right on the front page _chef 's kiss_
        
         | wikiwong wrote:
         | Great talk, thanks for sharing! Would love to hear if Extism
         | allows you to accomplish this, and if not, what prevented you.
         | We're always down to chat on Discord, but an issue on the Ruby
         | SDK repo will do just fine as well -
         | https://github.com/extism/ruby-sdk/
        
         | bhelx wrote:
         | This is great so far btw! Going to watch this whole talk today.
        
           | yebyen wrote:
           | There's a lightning talk version from GitOpsCon (at
           | GitOpsCon/CDCon Vancouver - co hosted with OSS Summit later
           | in the week)
           | 
           | But they are pretty much the same talk, except at CDCon, I
           | hadn't written the Kubernetes operator so that it actually
           | ran the Wasm module yet. At the end of the talk at OSS
           | Summit, I show it running and I'm so glad you enjoy it! I
           | will definitely check out your new ruby SDK :tada:
        
         | bhelx wrote:
         | I've been working on a new Ruby SDK for Extism 1.0 if you want
         | to check it out: https://github.com/extism/ruby-sdk
         | 
         | I added host function support and cleaned up the API a bit.
        
       | beepbooptheory wrote:
       | This and its relatives feel like such a weird positioning choice
       | for a company. If you have resolved to use some client library to
       | do your heavy lifting, you want one focused and hardened on the
       | specific language you are using, not one library of a dozen
       | libraries spuriously maintained by a startup which will most
       | likely eventually deprecate the library if its not used with
       | their Edge hosting service or whatever.
       | 
       | The huge list of languages does _not_ inspire confidence. Like
       | how going to a restaurant where the menu says they have amazing
       | pizza _and_ pho _and_ ice cream makes one think that all three of
       | those items are pretty bad.
        
         | nilslice wrote:
         | this makes no sense at all
        
       | wikiwong wrote:
       | A lot of people ask why one would use Extism and how exactly does
       | it help, so I wrote a blog post to explain it detail. I hope it
       | is informative!
        
       | andybak wrote:
       | Another open Source project locking their community discussions
       | away on Discord where it can't be easily discovered or searched.
       | 
       | At least consider mirroring to the web - or at this stage inform
       | people you will one day make posts available on the open web.
       | Acquiring that consent afterwards is painful.
        
         | treyd wrote:
         | I've been wanting a bot that would scrape discord conversations
         | into a database and then render them as HTML to be served
         | statically, bash.org-style.
        
         | ImHereToVote wrote:
         | I prefer to read documentation via Minecraft chat. That way I
         | can craft a diamond pickaxe to smash my head in.
        
           | pawelduda wrote:
           | You can run examples in redstone
        
         | nilslice wrote:
         | hear ya loud and clear -- and we use multiple forms of
         | communication.. GitHub issues and discussions are actively
         | suggested when we find that a conversation is turning into
         | something that would benefit others and move from Discord.
         | 
         | Discord is really advantageous for us to have real-time
         | conversations with people though.
        
           | esafak wrote:
           | Note to other maintainers: GitHub does have a nice Q+A
           | feature. Use that, not Discord!
           | 
           | https://github.com/features/discussions
        
             | justinclift wrote:
             | Not really a real-time chat replacement thing, so it's not
             | a suitable replacement.
        
         | SkyMarshal wrote:
         | Is there some service available for mirroring discord chats the
         | web?
        
           | esafak wrote:
           | https://www.linen.dev/landing
        
             | SkyMarshal wrote:
             | Looks excellent, thanks!
        
               | dizhn wrote:
               | Zulip has a read only view available for the web too.
        
               | SkyMarshal wrote:
               | Oh cool, thanks!
        
           | [deleted]
        
         | h4x0rr wrote:
         | Iis there any problem with that? Discord is nice to use, free
         | and most people already have it.
        
           | andybak wrote:
           | 1. Discord search is very poor
           | 
           | 2. Discord will go away one day and so will all the
           | accumulated knowledge
           | 
           | 3. People who aren't directly looking for your project won't
           | find it. It's will have no search footprint. You have to
           | actively seek out the Discord to discover that that's
           | activity there.
           | 
           | "Most people" don't already have it. Only a fairly specific
           | handful of demographics.
        
             | pests wrote:
             | > "Most people" don't already have it. Only a fairly
             | specific handful of demographics.
             | 
             | This just shows how in-a-bubble people can be. I'm trying
             | to think of a single person outside of my hardcore gamer
             | friends that I know who would have Discord - drawing a
             | blank.
        
           | troupo wrote:
           | The problem is that information in Discord is locked away and
           | is completely inaccessible.
           | 
           | As an example. An Elixir library I'm using, Ash, had its
           | support forum on Discord. Just recently they moved it to a
           | proper forum. Here's the _immediate_ result [1]:
           | 
           | --- start quote ---
           | 
           | Moving to ElixirForum just benefited me. I googled elixir ash
           | registry to understand what it is and if I still need it (I
           | ended up with it from an example somewhere). The top result
           | was this excellent question and answer
           | 
           | --- end quote ---
           | 
           | A forum is always nicer, and is accessible to more people.
           | 
           | [1] https://elixirforum.com/t/ash-community-updates/58515/9
        
           | self wrote:
           | There are several problems with Discord; see
           | https://mastodon.derg.nz/@anthropy/110922638711307077
        
           | dvngnt_ wrote:
           | can't view without a phone number at times
        
             | justinclift wrote:
             | Discord doesn't seem to need a phone number.
             | 
             | Are you thinking of Telegram, which does?
        
         | djhworld wrote:
         | I really miss forums tbh, what happened to them?
         | 
         | It feels like Discord has replaced the good old forum but it's
         | worse in so many ways.
        
           | IshKebab wrote:
           | Most forums were awful phpbb nonsense where it was impossible
           | to find the information you wanted. Search always required
           | logging in and the only interface for very long threads was
           | paging through them 10 badly laid out posts at a time.
           | 
           | No thank you.
           | 
           | Of course modern forums are better. Disqus is ok, and D's
           | forum software is arguably the best thing to come out of the
           | D project.
           | 
           | In any case Discord is not a replacement for forums; it's a
           | replacement for IRC.
        
             | bmacho wrote:
             | None of the phpBB-like forums that I am aware of (phpBB,
             | SMF, vbulletin) require login to search.
        
               | ipsi wrote:
               | I recall running into the odd one or two like that - I
               | have vague memories that it was because searching was
               | _slow_ and it didn't take more than a few people using it
               | to bring the site to its knees. Restricting it to logged
               | in users helped, and I think I saw some sites restrict
               | searching to only post bodies for a period too, for
               | similar reasons.
               | 
               | I haven't run into it recently, but I have at least vague
               | memories of it happening in the past.
        
             | stavros wrote:
             | Unfortunately, it tries to also be a replacement for
             | forums, with the worst of both worlds (the lack of real
             | time, AND the lack of discoverability).
        
           | justinclift wrote:
           | > I really miss forums tbh, what happened to them?
           | 
           | Spammers and similar bad actors. :(
        
       | nilslice wrote:
       | If the 5x reduction in LOC to execute a wasm function isn't
       | enough, then hopefully the logo just carries us to wasm nirvana
       | :)
        
       ___________________________________________________________________
       (page generated 2023-10-04 23:01 UTC)