V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wzw
V2EX  ›  问与答

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

  •  
  •   wzw · 2020-04-18 22:49:40 +08:00 · 2105 次点击
    这是一个创建于 1680 天前的主题,其中的信息可能已经有所发展或是发生改变。
    朋友问到, 我回答不出...

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


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

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

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

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

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

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

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

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

    不知道的不乱说
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2165 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:20 · PVG 09:20 · LAX 17:20 · JFK 20:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.