[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)