虚拟机的内存内容可以被读取吗? (关于 Python 源码保护的问题)

2020-04-18 22:49:40 +08:00
 wzw
朋友问到, 我回答不出...

情况如下:
1. 主机 Windows 10
2. 虚拟机 软件 virtualBox
3. 虚拟机系统 Debian
4. Debian 全盘加密 LUKS
5. Debian 里面跑了一个 Python 3 的程序


请问这样的方案能保护这份 Python 源代码吗? 会不会正在跑的时候, 通过虚拟机内存读取.

不讨论这份代码的重要性.谢谢.
我也很好奇.如果虚拟机运行的时候无法从内存读取东西, 通过这样的方式是可以保护到 Python 的源代码了.
2090 次点击
所在节点    问与答
20 条回复
shansing
2020-04-18 22:56:19 +08:00
虚拟机既然模拟了完整的硬件环境,应该是可以读取内存的吧。你只提供虚拟机镜像文件吧?再不济 VirtualBox 是开源的,总有办法改个源码(如果不用插件,我不知道有没有)调试内存吧。

等一个专业回答。
wzw
2020-04-18 23:00:43 +08:00
@shansing 虚拟机全盘加密了,只能是内存了。
Jirajine
2020-04-18 23:06:57 +08:00
当然可以,memory dump 是虚拟机的基本功能了,你再怎么加密也总要解密读到内存里,要确保安全只能物理隔离。
但谁会闲的蛋疼这么搞,重要的代码用编译型语言重写不费事吧,不过仍然不能确保你内存中的数据安全。
westoy
2020-04-18 23:10:52 +08:00
问题是流程正义的话, 你分发 debian 本身得把你的 debian 开源给对方啊.....当然你可以把你的程序加密或者写个启动文件远程加载来规避, 但是这套系统自带的加载系统本身也得开源啊.......所以对方很容易顺藤摸瓜搞到执行文件, 在不在虚拟机里有什么区别......
wzw
2020-04-18 23:13:24 +08:00
@Jirajine #3 编译型语言 能保护源代码了. 这里讨论源代码安全. (数据安全就是另外一回事了)

那么这样看来, Python 源代码安全只能靠物理隔离了....
wzw
2020-04-18 23:14:25 +08:00
@westoy #4 全盘加密启动的时候调用 yubikey 等 key 来解开加密的磁盘. 所以说磁盘文件是安全的
jakezh
2020-04-18 23:22:34 +08:00
不懂就问,python 在内存里跑的也是编译后的字节码吧,跟编译型解释型有关系吗
vk42
2020-04-18 23:29:52 +08:00
对 Host 端来说虚拟机就是在裸奔。如果要应用对 OS 保密,可以看看 Intel 的 SGX 或 AMD 的 SEV
wzw
2020-04-18 23:43:01 +08:00
@vk42 #8 如果磁盘全盘加密, 其实暴露的就是内存了
yzwduck
2020-04-18 23:43:28 +08:00
如果敌手能控制虚拟机,拍个快照就能保存所有内存信息,并且是没有加密的。里面肯定有:
1 、Python 代码在内存的缓存;
2 、LUKS 的 解密密钥。
从内存快照读出上述信息有一定难度,但完全可行。甚至还可以修改内存。

我觉得更容易的攻击方式是,虚拟机的 LUKS 是如何解密的?如果解密密钥放在虚拟机内,并且敌手能挂载虚拟磁盘的引导分区,那么密钥就很简单地读取出来, 不必折腾内存。
wzw
2020-04-18 23:49:45 +08:00
@yzwduck #10 密钥是用 Go 来写的, Go 调用 yubikey,判断是否可以解密磁盘. 密钥在 Go 程序里面
yzwduck
2020-04-18 23:58:34 +08:00
如果敌手能够独立地运行虚拟机(比如拥有 yubikey ),理论上他就能够自行解密出所有内容,除非他卡在程序被混淆、自身技术不足等问题上。
vk42
2020-04-19 00:29:07 +08:00
@wzw 这两个就是加密内存的,和外存没啥关系
yzwduck
2020-04-19 00:34:23 +08:00
@vk42 然而目前大部分虚拟机不支持 SGX 。
vk42
2020-04-19 00:56:02 +08:00
@yzwduck 他的需求明显不是为了跑虚机啊,现在 SGX 有 Python 环境了,不过不知道能达到商用程度不
wzw
2020-04-19 07:43:51 +08:00
@yzwduck #14 @vk42 #15 根据大家的回复, 只能说假设需要保护源码, 还是需要用编译型语言来写吧. 例如 Go
hanssx
293 天前
楼主最后怎么解决的,我最近也想这么弄。
wzw
293 天前
@hanssx 用 Golang 重构了 ...
hanssx
293 天前
@wzw 哇,感谢楼主回复。

话说如果我用 Cython 把 Python 编译二进制.so ,在内存中运行的时候应该是二进制吧。

感觉最后应该和 Go 一个效果吧。

内存 dump 的话,dump 出来的二进制再转换成汇编代码?相当于反汇编,最后依然还是能破解?
wzw
293 天前
@hanssx #19 我没有看过文档就不回复了, 你看看文档,

不知道的不乱说

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663852

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX