基于wasm的探索与研究(三)

wasmer运行时

上一篇文章分享了基于wasm的openssl实践,讲述了openssl的MD5算法如何在浏览器中执行。在探索过程中发现了openssl是可以通过wasm编译后直接run,并且有自己的runtime,这是因为openssl.wasm是通过wasmer编译运行的,这一篇文章分享制作具有运行时的openssl.wasm

概述
  • Wasmer介绍
  • Openssl编译到WASM
  • 总结
一、Wasmer介绍

Wasmer是一个用于在服务器上执行WebAssembly的开源运行时。支持基于WebAssembly的超轻量级容器,该容器可以在任何地方运行,还可以嵌入其他编程语言。其生态包括以下几个部分:

1. Wasmer Runtime

Wasmer Runtime是Wasmer生态其中一个,允许wasm模块可以独立运行。关键功能是使程序能够以任何编程语言运行;使二进制文件能够在Wasmer支持的任何“操作系统”(例如Linux、macOS、Windows和FreeBSD)上不加修改地运行;充当Wasm模块,通过应用程序二进制接口(ABI),如WASI(WebAssembly System Interface)和Emscripten(1.38.43及更早版本)与本机“操作系统”功能交互的安全桥梁。

2. WAPM

WAPM是WebAssembly Package Manager的缩写,为可以独立使用的Wasmer Runtime做的软件包管理器。可以理解为通过Wasmer软件包编译出来的.wasm文件是可以独立运行的,WAPM就是为了管理这些能独立运行的runtime而存在的。如图:

在这里插入图片描述
搜索一个openssl运行时的.wasm。

在这里插入图片描述
提供了运行时环境。

在这里插入图片描述

整个看上去和docker hub有点像,还有制作方法,我们可以参考做一个新版的openssl.wasm.

在这里插入图片描述

3. WebAssembly.sh

WebAssembly shell程序是一个在线shell程序,您可以在其中拖放WebAssembly模块以进行尝试,还可以执行WAPM中可用的WASI模块的所有命令。在线演示地址:https://webassembly.sh/

在这里插入图片描述

4. Wasienv

Wasienv是一个工具,旨在将所有编程语言引入WebAssembly WASI的工具可以将不同的编程语言编译到WebAssembly中,然后在浏览器或服务器中运行程序。

看上去和上一篇我们使用的Emscripten很像,虽然两者都能把高级语言编译成.wasm文件,但是后者更注重web方面的开发在浏览器中运行(也是第一个生成wasm的工具),前者是解决跨平台的问题,体现的是wasm的可移植性。

这里有个WebAssembly WASI的概念,WASI是WebAssembly System Interface的缩写,是WebAssembly 平台的系统接口, 由Wasmtime项目设计,目的是为WASM设计一套引擎无关(engine-indepent), 面向非Web系统(non-Web system-oriented)的API标准。因为 WebAssembly 是概念机的汇编语言,所以 WebAssembly 需要一个概念操作系统的系统接口,而不是任何单一操作系统的系统接口。 这样,它就可以在所有不同操作系统中运行。

二、 Openssl编译到WASM
1. 环境准备
  • Python 3.7.3

  • Pip3 19.3.1

  • Openssl 官网: https://www.openssl.org/source

  • 依赖工具 wasienv

2. 安装wasienv
curl https://raw.githubusercontent.com/wasienv/wasienv/master/install.sh | sh
问题1
我本地无法解析raw.githubusercontent.com
解决办法
把install.sh复制到本地执行
问题2
执行过程中 pip3 install wasienv --install-option="--install-scripts=$INSTALL_DIRECTORY/bin" --upgrade --user 报错,不支持这种写法

WARNING: Skipping wasienv as it is not installed.
/usr/local/lib/python3.7/site-packages/pip/_internal/commands/install.py:235: UserWarning: Disabling all use of wheels due to the use of --build-option / --global-option / --install-option.
  cmdoptions.check_install_build_global(options)
ERROR: Location-changing options found in --install-option: ['--install-scripts'] from command line. This is unsupported, use pip-level options like --user, --prefix, --root, and --target instead.
解决办法
经过查阅资料,是因为pip3更新到最新版本导致,不支持--install-option=“”显示传参,回退版本

pip install --upgrade pip==19.3.1
问题3
执行过程 curl https://get.wasmer.io -sSfL | sh报错,无法解析域名
解决办法
浏览器访问,把内容复制出来,我保存的文件是install2.sh,修改install.sh中的引用。
问题4
执行过程  INSTALL_DIRECTORY/bin/wasienv install-sdk unstable

 File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 659, in urlopen
conn = self._get_conn(timeout=pool_timeout)
 File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 279, in _get_conn
return conn or self._new_conn()
 File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 948, in _new_conn
"Can't connect to HTTPS URL because the SSL module is not available."
解决办法

分析

这是说python没有ssl模块,对于依赖的包,无法下载的问题。
经过查阅资料,python ssl模块对于openssl的版本有要求,所以这里尝试升级openssl

# 当前版本
~/Desktop/wasm$ openssl version
LibreSSL 2.8.3
# 安装其他版本openssl,第一步很慢
brew update && brew upgrade
brew uninstall --ignore-dependencies openssl; 
brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb

参考文档

https://www.jianshu.com/p/f8585da77ed9

https://stackoverflow.com/questions/45954528/pip-is-configured-with-locations-that-require-tls-ssl-however-the-ssl-module-in/59280089#59280089

https://stackoverflow.com/questions/35280956/ignoring-ensurepip-failure-pip-7-1-2-requires-ssl-tls-python-3-x-os-x#35282183

#设置brew源
https://www.jianshu.com/p/b26c7bc14440
问题4.1

安装openssl 错误

Error: Calling Non-checksummed download of openssl formula file from an arbitrary URL is disabled! Use 'brew extract' or 'brew create' and 'brew tap-new' to create a formula file in a tap on GitHub instead.
If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
https://github.com/tebelorg/Tump/issues/new
解决办法

是openssl版本问题

执行

brew uninstall openssl
brew tap-new $USER/old-openssl
brew extract --version=1.0.2t openssl $USER/old-openssl
brew install openssl@1.0.2t

参考文档:https://github.com/kelaberetiv/TagUI/issues/635

一顿操作之后,wasienv工具安装完成。

3. openssl 生成 .wasm文件

我通过WAPM找到了openssl编译的脚本,这是一个开源的例子。

git clone https://github.com/wapm-packages/OpenSSL.git

目录结构

在这里插入图片描述

build.sh

#!/usr/bin/env sh

# Based on code from https://github.com/TrueBitFoundation/wasm-ports/blob/master/openssl.sh

OPENSSL_VERSION=1.1.1d
PREFIX=`pwd`

DIRECTORY="openssl-${OPENSSL_VERSION}"

if [ ! -d "$DIRECTORY" ]; then
  echo "Download source code"
  wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
  tar xf openssl-${OPENSSL_VERSION}.tar.gz
fi

cd openssl-${OPENSSL_VERSION}

echo "Configure"
make clean
wasiconfigure ./Configure linux-x32 -no-asm -static -no-sock -no-afalgeng -DOPENSSL_SYS_NETWARE -DSIG_DFL=0 -DSIG_IGN=0 -DHAVE_FORK=0 -DOPENSSL_NO_AFALGENG=1 -DOPENSSL_NO_SPEED=1 || exit $?

cp ../progs.h apps/progs.h

sed -i 's|^CROSS_COMPILE.*$|CROSS_COMPILE=|g' Makefile

echo "Build"
wasimake make -j12 build_generated libssl.a libcrypto.a apps/openssl

rm -rf ${PREFIX}/include
mkdir -p ${PREFIX}/include
cp -R include/openssl ${PREFIX}/include

cp -R apps/openssl.wasm ../

echo "Done"

思路如下:

  1. 从openssl官网上下载对应版本的包。
  2. 通过之前安装的wasienv工具生成Makefile文件。
  3. cp progs.h文件到openssl/apps目录下
  4. 编译生成wasm文件,此时wasm文件在apps/openssl目录下。
  5. 将openssl/include和.wasm文件复制到新的目录下。

4、验证openssl.wasm

~/Desktop/wasm/openssl_demo/OpenSSL$ wasmer run openssl.wasm
OpenSSL> help

Standard commands
asn1parse         ca                cms               crl
crl2pkcs7         dgst              dhparam           dsa
dsaparam          ec                ecparam           enc
engine            errstr            exit              gendsa
genpkey           genrsa            help              list
nseq              ocsp              passwd            pkcs12
pkcs7             pkcs8             pkey              pkeyparam
pkeyutl           prime             rand              rehash
req               rsa               rsautl            sess_id
smime             spkac             srp               ts
verify            version           x509

Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md4
md5               mdc2              rmd160            sha1
sha224            sha256            sha384            sha512
speed

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       base64            bf
bf-cbc            bf-cfb            bf-ecb            bf-ofb
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb
des               des-cbc           des-cfb           des-ecb
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb
des-ofb           des3              desx              idea
idea-cbc          idea-cfb          idea-ecb          idea-ofb
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc
rc2-cfb           rc2-ecb           rc2-ofb           rc4
rc4-40            seed              seed-cbc          seed-cfb
seed-ecb          seed-ofb

看起来还不错,基本的命令还是有的,生成一个rsa私钥试试。

#!/usr/bin/env sh
wasmer run openssl.wasm --dir=. -- genrsa -des3 -out priv.key 1024 || exit $?

~/Desktop/wasm/openssl_demo/OpenSSL$ cat priv.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,6D2827691E261E49

ADR7PRPukSBTEHiWvLxuj8DyU9QtiZIC0ZEQxJMRhx7n0b1J5wnrmIMfwbgtVLru
7vi/zdMqwIRJ7Afq3/g0r0/rWA55CF3SCX+UVSGnMrkOV68MWh2ETFCBD3NqmNG3
XZToct1bON0ES6OTEON+4V3PBunSpeU+6EKE8pTOLBeb6Frt1IQ1FgG8xVGfsCnk
DJKncHzN0D66mFlW0mrluiNvHk/PfBvzXQv2FlTdvctThOj/DK6yQ3m4PtPLYn1d
7qOy1wQt1OuXHnymgkR66Rf6OA2aAJXPxBp7C/aVxEAWWLKNw3zv/9rhlOqkIsEQ
i+tnf58VEBR6HGCDXA4UD83x1Pr9h0l5pcrHcvZYv+bnSiIhZGIVSCx0U9jmgbef
qg+L4wzIaaWaOTKpCtHm/10DWII5H6TO6uQHF8Bjz3bvR77tv/jaKRgrG+F7y4h9
5I+DsQjHhcQvIi2aro2o0DGsaD0qLK4jWbvFRxBb7FBfBEFQ9AWz04tZ9Oco5/Ti
ybMaZyLoCNGauqEQV3vS1OoR9IZ1Dzqra5X+YDRSGxTN+31dSCDYH5ta1VTHJyis
SMDfEisqz6vcIyEf+pWzF+yzhQj9aAqFEbWg+pG0Bhx4GXxhLy0WjnFVlWHxjTjN
hoZYC0vKc9uNvzaewFjHEn3IwnXTaXdknE25uBBc18ceBsaW7uzW7D4iPvjhtOC3
znrwo+VGuNPGJTb7md9Dz1q2fjTrPintPftN9ZqxAjeYx+7NiVZfm71mV88EAXYW
eQMQZmTFTiSyTcotDkyRPkvbDbXEytB4sVbwXiBasKxmrgzgz6UIjA==
-----END RSA PRIVATE KEY-----


三、总结

本篇文章主要介绍了WebAssembly的运行时,以及如何制作一个运行时的openssl.wasm。整体感觉还不错,现在我们有了运行时的openssl.wasm,并且支持基本的命令,但不知道性能如何,下一篇文章分享openssl.wasm与原生openssl性能对比。

参考资料
  • Wasmer文档
    • https://docs.wasmer.io/
  • WAPM
    • https://wapm.io/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
“wasm基础安全缺陷与基于软件的故障隔离.pdf”是一篇介绍WebAssembly基础安全问题的论文。论文指出WebAssembly的执行环境使得WebAssembly模块能够使用JavaScript的API,这本身是一个安全问题。同时,WebAssembly的内存管理也存在安全隐患。 在内存管理方面,WebAssembly的线性内存可以通过指针被访问和修改。这为攻击者提供了一个攻击入口,可以通过指针操作,越过内存保护来实现代码注入和执行、内存泄漏等攻击。同时,WebAssembly只提供了限制性的内存保护机制,无法保护内存中的数据免受攻击。而且,WebAssembly的执行速度很快,这也可能会导致攻击者能够在很短的时间内完成攻击,增加了攻击的风险。 针对WebAssembly的安全缺陷,论文提出了基于软件的故障隔离技术来增强WebAssembly的安全性。该技术通过将不同的WebAssembly模块分别运行在不同的进程上,来实现隔离和保护。每个进程只能访问它所属的模块,并且进程之间无法互相访问或共享内存。这种技术也被称为进程级别隔离(Process-Level Isolation)。通过这种隔离技术,即使一个WebAssembly模块被攻击,也不会影响其他WebAssembly模块或系统的安全性。 总的来说,WebAssembly的基础安全存在缺陷,但是通过基于软件的故障隔离技术可以有效提高WebAssembly的安全性。这将为Web应用提供更好的安全保护,提高Web应用的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值