我们有一个设置,允许外部用户通过UI运行分析工具。在此界面中,某些工具将R对象作为RDS接收为输入。这样安全吗?有人可以在提供的RDS中注入恶意代码调用(或其他攻击)吗?我们只使用loadRDS和saveRDS,而不是更一般的加载和保存处理整个工作区。
答案 0 :(得分:1)
从技术上讲,RDS对象是“任何东西”的单个对象。在此功能中,将有一个隐藏的系统调用,您认为这可能会引入漏洞利用。 system()函数将以用户身份在控制台上执行命令。只要运行R的进程具有访问权限,就可以利用它来利用主机系统。
示例:
x <- function() {
system("echo EXPLOIT")
}
saveRDS(x, "x.RDS")
y <- readRDS("x.RDS")
y()
当然,y必须在readRDS之后的代码中执行。
假设您正在使用存储在对象中的函数读取S3或S4对象。当代码执行此功能时,可以运行代码。
与许多编程语言一样,需要检查输入,并检查对象是否属于某个类必须非常严格(例如,如果您询问是否是data.frame,则它将响应TRUE) 。您可能会提取读入对象的值,然后使用这些值创建一个新对象,或者您确实确定不可能执行此操作。
使用 eval 时,人们可能会想到更多的创造性利用。
希望有帮助。