避免使用 system() api

避免使用 system() api

我们有一个遗留的 C 代码,用于允许权限较低的用户以升级的权限运行自定义脚本。这已设置 SUID 位。此代码将 PATH env 限制为特定文件夹,然后使用system()api 通过受限 shell 执行脚本:

/bin/bash -r -c "script <arg>"

由于路径受到限制,它只能执行该特定文件夹中的脚本。

现在知道了api命令注入的所有陷阱system(),可以采取哪些措施来避免命令注入呢?这在各种脚本等的许多地方使用,所以不想做一个全新的实现以避免任何回归。

答案1

因为很难做到正确,所以我建议删除代码中的 SUID。更改您的 C 代码以使用sudo.通过使用 sudo 来完成安全系统编程的困难方面。

然后,您可以使用 visudo 仔细构建 sudo 配置,该配置执行执行任务所需的最低限度,并将其限制为所需的用户/组。配置 sudo 后,请除您之外的其他人对其进行测试并尝试打破预期的限制。

答案2

代码注入要求用户能够将任意字符串作为参数传递给调用system()。这与 SQL 注入非常相似,应该以类似的方式避免:不要将任何用户定义的字符串直接传递给调用:

  • 数字参数应转换为整数,然后在调用时转换回字符串

  • 属于固定字典的参数应转换为“枚举”值或类似值,然后在调用时返回字符串

  • 自由文本输入应尽可能限制为无害的字符集(例如[a-zA-Z0-9]*)。当需要有问题的字符(包括空格)时,应应用适当的转义(即a b应替换为a\ b等)

相关内容