В Интернете WebAssembly работает в той же песочнице, что и JavaScript, поэтому WebAssembly не может повлиять на свой хост-компьютер никоим образом, что также невозможно сделать с помощью чистого JavaScript. Но WebAssembly идет дальше, и делает более безопасным запуск ненадежного кода из-за того, как работает его импорт.
Когда создается экземпляр модуля WebAssembly, он поставляется с набором импортированных функций. Эти операции импорта являются единственными основными функциями, к которым у модуля есть доступ, и их нельзя изменить после создания экземпляра модуля. Без импорта модуль WebAssembly может выражать только чистые вычисления и может влиять только на состояние своей собственной памяти. Это означает, что если вы не предоставите импорт, который может выполнять сетевые запросы, вы можете быть уверены, что модуль WebAssembly не может выполнять сетевые запросы. Сравните это с JavaScript, где выяснить, использует ли программа определенный API, вообще невозможно.
Это не означает, что код в модуле WebAssembly не может содержать ошибок или уязвимостей безопасности. Например, атаки переполнения буфера на глючные программы C все еще возможны, когда эти программы C компилируются в WebAssembly, но разница в том, что худшее, что они могут сделать, определяется импортом, который легко проверить. Поэтому, если вы импортируете eval
в свой модуль C WebAssembly с ошибками, у вас могут быть серьезные проблемы, но если вы импортируете только console.log
, злоумышленник может сделать только спам на вашей консоли.
Я не считаю WebAssembly низкоуровневой как относящуюся к безопасности. Модули WebAssembly не сложнее для чтения, чем свернутый или запутанный JavaScript, и разница почти исчезает, если учесть JavaScript в стиле asm.js. Конечно, читать модуль WebAssembly труднее, чем красиво напечатанную программу JavaScript, но в действительности это никуда не денется с точки зрения безопасности.