能否实现bash shell脚本加密为非人类可读,仅允许执行、禁止其他root用户读取代码
先把最核心的现实说在前面:Linux下持有全量权限的root用户,天然自带无视任意文件权限位读取内容的能力,不管你把文件权限设成
--x--x--x还是别的什么,对方只要执行个chmod 600 your_script.sh就能改回权限读走明文,单靠文件权限机制根本拦不住同机的其他root。想要实现“其他root打开文件只能看到加密乱码,看不到明文代码逻辑”,必须跳出靠权限拦root的思路,目前实际能用的方案有这几个:
将Shell脚本加密编译为原生ELF二进制可执行文件
这是投入成本最低的实现方式,不需要改动原有脚本的任何业务逻辑,用专门的Shell脚本加密编译工具,就能把明文代码打包成带加密保护层的原生可执行文件。转换后的文件在被任何用户(包括其他root)用文本编辑器、cat等工具打开时,只会显示无意义的二进制乱码,完全看不到可读的Shell代码逻辑,完全符合预期。
典型操作流程:# 对原始脚本做加密编译,生成独立的可执行二进制 shc -f your_raw_script.sh -o run_service -m "无源码查看权限" # 清理二进制内残留的符号信息,提高逆向难度 strip run_service注意操作细节:编译完成后要彻底删除本地保存的明文原始脚本,不要留临时文件;尽量用最新版本的编译工具,避免旧版本加密逻辑过弱,被简单的字符串提取工具拽出明文片段。
全内存流式解密执行,全程不把明文落到磁盘
如果担心编译后的二进制被逆向,可以换用“密文落盘、内存解密执行”的思路:- 把核心的Shell脚本内容用高强度对称算法加密,把密文存在磁盘上
- 写一个逻辑极其精简的启动器,把解密需要的密钥存在仅你本人可访问的tmpfs挂载点(tmpfs完全运行在内存中,断电即清空,不会把内容写入磁盘)
- 启动器运行时,直接在内存中完成密文解密,全程不生成任何落盘的临时明文文件,把解密后的脚本内容通过管道直接喂给Bash解释器执行
这种模式下,其他root就算翻遍磁盘,也只能拿到加密后的密文内容,看不到任何可读的明文逻辑;如果配合系统的ptrace保护规则,禁止非授权进程附加到启动器进程读取内存,防护强度还能再上一个台阶。
拆分内核能力,给其他共享的root账号降权
很多人不知道,Linux里所谓的“root万能权限”,本质上是十几种独立内核能力的集合,并不是只要uid是0就拥有所有权限。如果你是这台设备的实际管理员,完全可以调整系统的能力分配规则:不给其他需要用机器的共享root账号分配“无视文件权限读任意文件”的对应能力,把这些root账号改成“阉割版root”——日常操作(比如开服务、装软件)都不影响,但没法越过文件权限读你设置成仅可执行的脚本。
这种配置下,你把脚本权限设成--x--x--x是真的能拦住其他root的,对方没有对应的内核能力,就算是uid=0,也会被权限规则挡住,读不了脚本内容,只能正常执行。
避坑提醒:这些操作完全达不到防其他root的效果,别浪费时间试:
- 只靠
chmod --x--x--x设权限,全权限root可以一秒钟改回文件权限,根本拦不住- 把脚本藏在深层目录、改个奇怪的后缀,全权限root可以遍历全盘所有可执行文件,根本藏不住
- 只加密不做内存保护,其他root可以直接通过进程附加工具,把内存里运行的明文脚本扒出来
最后补个现实边界:所有用户态的防护方案,都防不住能接触硬件、拥有内核调试权限或者能加载自定义内核模块的root用户——只要对方能改内核,任何用户层的加密、权限设置都能被穿透,这是Linux权限模型的固有特性,没有可以绕过的办法。
内容的提问来源于stack exchange,提问作者Linus

