V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zyEros
V2EX  ›  程序员

SecurityWorker: Javascript 核心算法全防护

  •  2
     
  •   zyEros · 2019-03-27 22:45:04 +08:00 · 6731 次点击
    这是一个创建于 2069 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们自己的工作中会涉及到浏览器端的通信数据加密,但一般普通混淆太容易被黑盒或白盒利用了,后来我们使用 Webassembly 以及 asmjs 加密,但频繁用 C++写相对应的逻辑太麻烦,因此我们在工作中沉淀了 SecurityWorker。简单的说,SecurityWorker 是个可靠的类 WebWorker 环境,他有独立的 VM,兼容 ECMAScript5.1,如此一来既方便你写又有足够的保护强度。

    特性:

    • 完整的 ECMAScript 5.1 标准兼容性
    • 极小的 SecruityWorker VM 文件体积(~160kb )
    • 保密性极强,执行逻辑及核心算法完全隐匿不可逆
    • 可选择支持多种环境,Browser/NodeJS/小程序(默认不允许 NodeJS 黑盒运行)
    • 良好的浏览器兼容性,主流浏览器全覆盖
    • 易于使用,API 兼容 WebWorker (不允许访问 DOM/BOM )
    • 易于调试,被保护代码不做混淆,报错信息准确

    兼容性

    • IE11
    • Chrome 20+
    • Safari 8+
    • Firefox 4+
    • Edge 12+
    • Android 4.2+
    • iOS 8+
    • NodeJS V4+(Doing)
    • 小程序(Doing)

    官网: https://www.securitify.io
    文档: https://github.com/qiaozi-tech/SecurityWorker

    第 1 条附言  ·  2019-03-28 08:22:01 +08:00
    SecurityWorker 的目标是足够强的目标代码加密,他应该是你整体安全方案中的一环,并不是一个完整的方案
    42 条回复    2019-04-10 16:54:19 +08:00
    zsx
        1
    zsx  
       2019-03-27 23:08:01 +08:00
    看了一下代码,大概是你们自己写了一个跑 OPCode 的 Runtime,然后用 Emscripten 把这个 Runtime 编译成 asm.js ?这么玩了性能居然还只降低这么一点。。。
    zyEros
        2
    zyEros  
    OP
       2019-03-27 23:09:00 +08:00 via Android
    @zsx 是的,没错,高手,这么容易被点破了
    zsx
        3
    zsx  
       2019-03-27 23:31:53 +08:00
    @zyEros #2 不是啥高手哈。。我最近在做一个 PHP 的加密,在性能和安全上摇摆不定。看了一下你的文档,还是挺惊讶于你的性能降低居然只有这么一点的……
    alvin666
        4
    alvin666  
       2019-03-27 23:35:27 +08:00 via Android
    关注一下,js 的加密 /混淆一直是个难题
    zyEros
        5
    zyEros  
    OP
       2019-03-27 23:37:39 +08:00 via Android
    @alvin666 快来尝试 SecurityWorker,妈妈再也不怕核心代码被利用了
    yixiang
        6
    yixiang  
       2019-03-27 23:38:55 +08:00
    security by obscurity? hmmmmmm
    kimown
        7
    kimown  
       2019-03-27 23:38:58 +08:00 via Android
    我们有个策略,wasm 混合 js,然后合并其他库,最终输出 wasm 文件接近 10M,不知道这样有没有方法能解析出源码
    zyEros
        8
    zyEros  
    OP
       2019-03-27 23:40:28 +08:00 via Android
    @yixiang 并不是,是独立 vm 和执行 opcode,相比 ob 强度要大很多很多
    zyEros
        9
    zyEros  
    OP
       2019-03-27 23:42:47 +08:00 via Android
    @kimown 你们 js 最终会被 eval 执行,那么就存在风险。SecurityWorker 是独立的 vm,代码会被编译为 opcode bytes 然后混编,不存在 eval 之类的动态执行。但目前跟 WebWorker 一样,没有 DOM/BOM,需要两个环境通信
    kimown
        10
    kimown  
       2019-03-27 23:52:36 +08:00 via Android
    @zyEros
    意思是通过复写 eval 就可以获取执行的源代码?
    zyEros
        11
    zyEros  
    OP
       2019-03-27 23:54:50 +08:00 via Android   ❤️ 1
    @kimown 是的,不然我们不会做 SecurityWorker
    kimown
        12
    kimown  
       2019-03-28 00:10:58 +08:00 via Android
    @zyEros

    有个疑问,run script 最前面覆盖各种 console,alert 之类的函数,判断 eval 是否为 native,否就不执行,保证整个执行都在 VMXXX 内,这样还有办法可以破解吗

    https://stackoverflow.com/questions/6598945/detect-if-function-is-native-to-browser
    zyEros
        13
    zyEros  
    OP
       2019-03-28 00:15:42 +08:00 via Android
    @kimown 不行,因为我可以拿到你的代码,然后改文件输入 debug,你可能会因为代码太大导致 devtool 崩溃,但我们还有其他办法,比如通过 chrome 的协议远程调试然后跟踪到你 eval 逻辑前,或者直接在你 eval 前 ajax 发送代码,file api 操作等。这些弯路我们都走过。
    zyEros
        14
    zyEros  
    OP
       2019-03-28 00:17:07 +08:00 via Android
    @kimown 浏览器整个都是不安全环境,只要你的代码以原始代码动态执行在不安全环境,他就是不安全的
    polythene
        15
    polythene  
       2019-03-28 00:17:58 +08:00
    @zsx 不好意思,能告诉我在哪里看到的文档吗,我有点没太明白他们的具体做法?
    zyEros
        16
    zyEros  
    OP
       2019-03-28 00:20:18 +08:00 via Android
    @polythene “ SecurityWorker 不同于普通的 Javascript 代码混淆,我们使用 独立 Javascript VM + 二进制混淆 opcode 核心执行 的方式防止您的代码被开发者工具调试、代码反向。”以及“ SecurityWorker VM 与 V8 等强调性能的 Javascript 引擎不同,SecurityWorker VM 主要目标是更小的 emscripten 生成体积以及更少的内存使用。对于 SecurityWorker VM 来说,我们并没有集成类似 V8 一样的 JIT 机制,而是使用通过离线翻译你的 Javascript 代码为 SecurityWorker VM 指令,然后在运行时解释执行的方式,因此在性能上会有一定的损失。”
    kimown
        17
    kimown  
       2019-03-28 00:25:55 +08:00 via Android
    @zyEros

    是的,当时我也考虑过,最后不行重编译 chromium,简单覆盖下 eval,原来方案就失效了,

    https://github.com/mbbill/JSC.js

    有考虑过 js 内嵌 jsc 吗,感觉这也是个思路,楼主有邮箱吗,以后可以交流下
    zyEros
        18
    zyEros  
    OP
       2019-03-28 00:29:00 +08:00 via Android   ❤️ 1
    @kimown 你嵌入 jsc 后和我们的做法就差不多了,邮箱在官网页脚有(逃
    tyrealgray
        19
    tyrealgray  
       2019-03-28 00:30:46 +08:00
    其实加密可以考虑 google 的方案,用 https://github.com/javascript-obfuscator/javascript-obfuscator

    基本上锁 domain 和禁用 console 后,解密的可能性就很低了
    zyEros
        20
    zyEros  
    OP
       2019-03-28 00:33:58 +08:00 via Android
    @tyrealgray 并不是,ob 实际上是混淆,但仍然可以通过代码逆出核心算法,相比 SecurityWorker 的强度来说低很多很多
    tyrealgray
        21
    tyrealgray  
       2019-03-28 00:36:32 +08:00
    啊,记错了,google 的方案是 Closure Compiler,javascript-obfuscator 是另外一个
    hanguofu
        22
    hanguofu  
       2019-03-28 02:35:29 +08:00 via Android
    这个工具太好了,解决了 js 的加密的大难题!
    binux
        23
    binux  
       2019-03-28 03:39:58 +08:00 via Android
    之前暴力破解过一个 fingerprint 的 js 的 VM 加密,直接断下 assign 的 op,修改中间步骤返回值就好了。
    你逻辑是加密了,但是终究是要在内存的某个部分拼出完整的请求提交数据的。
    zyEros
        24
    zyEros  
    OP
       2019-03-28 05:03:04 +08:00 via Android
    @binux 里面不存在 js 源码了,只会有离线翻译的 opcode bytes,opcode bytes 会做第二次加密
    zyEros
        25
    zyEros  
    OP
       2019-03-28 05:08:02 +08:00 via Android
    @binux
    1.上传代码
    2.JS 翻译为 opcode bytes
    3.二进制数据加密并重打包
    4.核心压缩加壳
    5.得到最终文件

    运行时解密得到 opcode bytes,然后 vm 执行,除非你知道我的 opcode 设计,否则很难继续 debug
    zyEros
        26
    zyEros  
    OP
       2019-03-28 05:10:53 +08:00 via Android
    @binux 哦,我懂你意思了,但是那样如何被大规模利用是个问题,我们还有一些环境监测,防止 node 运行,如果有时间可以试着破一破帮助我们改进(逃
    binux
        27
    binux  
       2019-03-28 05:12:51 +08:00
    @zyEros #25
    我并不需要源码啊,我直接改的内存数据。
    到这步下不去了,1.5. 微信扫码登陆,我不想扫码登陆。
    binux
        28
    binux  
       2019-03-28 05:15:04 +08:00
    @zyEros #26 确实没法大规模利用,那时候只是要破解一个网站的 fingerprint,而且我是在 electron 中运行的。
    zyEros
        29
    zyEros  
    OP
       2019-03-28 05:23:12 +08:00 via Android
    @binux SecurityWorker 只是保证代码安全,但是其他安全流程是需要使用者去设计的,包括数据的签名检验防止重放,检验 key 唯一下发等等,防止被大规模使用,这不是 SecurityWorker 要解决的问题
    Mutoo
        30
    Mutoo  
       2019-03-28 06:23:27 +08:00
    最大的风险难道不是“上传文件”到第三方服务,再编译成加密脚本吗。
    zyEros
        31
    zyEros  
    OP
       2019-03-28 06:34:48 +08:00 via Android
    @Mutoo 如果整体开源了就没有安全性可言了,流程和 opcode 设计都能看到,如果上传不信任当然也没办法了
    qdwang
        32
    qdwang  
       2019-03-28 08:09:44 +08:00 via iPhone
    @zyEros 可以考虑增加一个 opcode shuffle 的功能。让此功能生成一个随机又特定的 opcode encoder 和 decoder。这样每个用户的 opcode 都不一样,并且不透明的,破解者没那么容易反编译。

    但是上面人所说的也对,其实本质上还是可以破解的,只是需要花一些时间。

    这类库我也做过,不过不是拿来干代码加密的事情
    zyEros
        33
    zyEros  
    OP
       2019-03-28 08:15:47 +08:00 via Android
    @qdwang 没有 100%的安全(逃
    zyEros
        34
    zyEros  
    OP
       2019-03-28 08:19:13 +08:00 via Android
    @qdwang opcode bytes 我们是会进行二进制混淆的,并且会对 bytes 进行二次加密,每次加密的 key 是随机的,你说的 shuffle 是在二进制混淆的阶段做么
    qdwang
        35
    qdwang  
       2019-03-28 08:49:20 +08:00 via iPhone
    @zyEros 请问一下,你们 key 存哪里呢,是 webworker 内存里吗?

    随机变换可以在加密阶段前做
    zyEros
        36
    zyEros  
    OP
       2019-03-28 10:11:46 +08:00 via Android
    @qdwang 在 vm 内部通过一些算法取出,所以你有可能能获取到,但是即使取到意义也不大,源码已经变成 opcode,因为你没有 opcode 的设计以及一个供其运行的 runtime
    qdwang
        37
    qdwang  
       2019-03-28 11:55:59 +08:00
    @zyEros 哦哦 了解了。
    lamada
        38
    lamada  
       2019-03-28 13:27:06 +08:00
    mark 了,有点意思
    luvxy
        39
    luvxy  
       2019-03-28 14:24:31 +08:00
    在哪学这些安全方面的知识
    zyEros
        40
    zyEros  
    OP
       2019-03-28 15:05:36 +08:00 via Android
    @luvxy 遇到问题,解决问题
    weloveayaka
        41
    weloveayaka  
       2019-04-09 16:51:31 +08:00
    请问未来会出离线版本吗,会收费吗?
    有没有粉丝 QQ 群之类的?
    zyEros
        42
    zyEros  
    OP
       2019-04-10 16:54:19 +08:00
    @weloveayaka 离线版本 /收费 /定制化可以问我们的客服,vx:suyanqiong1986
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2821 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:05 · PVG 08:05 · LAX 16:05 · JFK 19:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.