如何对 shell 脚本的高危操作进行识别? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
piaochen0

如何对 shell 脚本的高危操作进行识别?

  •  
  •   piaochen0 2020 年 12 月 2 日 3550 次点击
    这是一个创建于 1969 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近开发的运维平台,在平台上提交 shell 脚本,然后在远程主机上跑。
    现在需求是要对提交的 shell 脚本进行高危操作检查,例如 rm -rf /*之类的。
    假如发现,不予以提交。

    考虑了好久,目前实现思路是按行读取提交的 shell 脚本,然后用正则识别 rm -rf /*之类的语句。
    不知道有没有其他更好的检测方案。

    第 1 条附言    2020 年 12 月 2 日
    感谢大家的回复
    其实我对这个需求也很困惑,
    其实生产主机作为研发是碰不到的,加权限控制范围的操作现在应该也有,不过不是我们研发能控制的。

    刚跟上面聊了一下,这个需求还是要做。
    现在就是具体怎么实现的问题
    用正则表达式去匹配,有点麻烦,我担心在 shell 中各种复杂的写法下特别容易误判。
    平台是用 python 做的,不知道 python 下有没有解析 shell 语法的第三方库。
    20 条回复    2020-12-03 17:21:07 +08:00
    QBugHunter
        1
    QBugHunter  
       2020 年 12 月 2 日
    ????
    你设好权限,怕啥?
    脚本没权限能 rm -rf /*?
    piaochen0
        2
    piaochen0  
    OP
       2020 年 12 月 2 日
    @QBugHunter #1
    1.上面要求在提交的时候,就要对危险操作进行拦截。
    2.不光是 rm -rf /*这种,还有其他的危险度比较高的操作,例如操作没有加范围,不允许 alias 操作等等。
    3.生产主机环境比较复杂,权限什么的,有些不是我们能控制的。
    lvzhiqiang
        3
    lvzhiqiang  
       2020 年 12 月 2 日
    我觉得还是权限控制比较靠谱, 比如只允许在某个目录区域进行操作(限定在 /app 目录)、只允许执行某些命令(比如 reboot 命令,就不允许普通用户执行)、屏蔽访问某些文件,否则的话,只能用穷举规则匹配咯,比如这种 cat /dev/zero > /dev/sdb ; 反正各种骚操作,只有你想不到,没有做不到。
    QBugHunter
        4
    QBugHunter  
       2020 年 12 月 2 日
    @piaochen0
    那感觉这个要求有点本末倒置了,就比如 rm,不用-rf /*,运气好 rm 一个文件就足以让服务器嗝屁。

    就以 rm 为例,怎么设置呢?,发现有 rm 就判断为危险显然不可能,rm 是 shell 里一个很常见的操作。那就用正则表达式匹配 rm 的文件?貌似也不太现实,你要列出系统里所有不能 rm 的文件名?
    再者,对面脚本会生成一个中间文件,结束前要删除,但这个文件名可能和你系统里某个数据文件相同(用正则表达式匹配相同),然后喜闻乐见你把这个脚本直接判断为危险,然后呢?

    服务器的安全问题,靠检测脚本始终是个不靠谱的行为
    Cbdy
        5
    Cbdy  
       2020 年 12 月 2 日
    人工 review
    westoy
        6
    westoy  
       2020 年 12 月 2 日
    容器 + selinux/grsecurity/apparmor 之类的做沙盒

    识别个蛋蛋啊, 执行三方程序、写到某个 rc 里、替换掉动态连接库 , 要乱搞, 骚操作多的是
    cmostuor
        7
    cmostuor  
       2020 年 12 月 2 日
    之前看华为光猫里有个实现方法 用 shell 脚本写个判断参数是否安全脚本去代替危险命令 比如 rm 把原本的文件改名, 用脚本写个判断参数是否安全的脚本 只有参数是安全才调用相应的原本的命令 不安全就返回错误

    也可以修改 bash 或 zsh 在其 applet 里添加参数是否安全的风控代码
    lululau
        8
    lululau  
       2020 年 12 月 2 日
    什么样的命令属于危险的操作,这个是需求吧,让提需求的人给出来个列表来啊
    timi
        9
    timi  
       2020 年 12 月 2 日
    如果是控制别人,可用堡垒机,也可用强制访问控制软件,保护重要数据
    37Y37
        10
    37Y37  
       2020 年 12 月 2 日
    脚本任何人都能提交,但需要审核,审核过的脚本才能执行

    so 审核一下
    thedrwu
        11
    thedrwu  
       2020 年 12 月 2 日 via Android
    楼主试过 `rm -rf $H0ME/*` 吗
    ajinwu
        12
    ajinwu  
       2020 年 12 月 2 日 via Android
    除了权限,其他防住很难,因为 payload 可以自行组合,很难识别
    linux40
        13
    linux40  
       2020 年 12 月 2 日 via Android   1
    缺个搞 shell 程序分析的。其实程序分析的需求很大,就是不怎么招人。招这种职位的只有几个大厂。

    正则表达式太弱了,你需要带有语义的分析工具。
    levelworm
        14
    levelworm  
       2020 年 12 月 3 日 via Android
    @linux40 这个是不是需要程序语言的博士之类的。
    piaochen0
        15
    piaochen0  
    OP
       2020 年 12 月 3 日
    @linux40 我在 github 上找了个解析 shell 的库,bashlex,正则想想还是放弃了。
    freeair
        16
    freeair  
       2020 年 12 月 3 日
    运维上,shell 应该经过测试才正式运行吧,版本应该是受控的。
    楼主的问题感觉不是运维这个纬度的,更像是安全层面的,代码扫描,像是要重新造轮子,仅能作为权宜之计。
    linux40
        17
    linux40  
       2020 年 12 月 3 日 via Android
    @levelworm 不一定啊,重要的不是学历,而是这方面的知识和经验。
    aloxaf
        18
    aloxaf  
       2020 年 12 月 3 日
    你这玩意儿看上去是给自己人用的,
    那就不需要考虑故意构造复杂的 payload 来攻击的情况了,不然你这项目肯定是没法做的。

    既然这样你随便糊弄一下,啊不,检查一下就行了,比如直接扔给 shellcheck 。
    lamesbond
        19
    lamesbond  
       2020 年 12 月 3 日
    这需求真迷惑,上份工作运维,上面要求在生产主机上操作尽量别用脚本,把命令先复制到记事本,前面加上#号,再粘贴到命令行窗口,能用 tail 或 head 就不用 cat,能用 cat 就别用 vim,修改文件前先备份文件等等,这就不是代码能检测出来的。
    生产环境别让开发上手最好,要就做好权责划分,出问题谁背锅先说好
    Sterne
        20
    Sterne  
       2020 年 12 月 3 日
    直接提交脚本这种操作方向错了。
    正确的做法是把常用的脚本固定下来,添加参数支持,研发只能传入参数去调用。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2842 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: .9.8.5 77ms UTC 13:47 PVG 21:47 LAX 06:47 JFK 09:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86