首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止将文件包含在系统目录之外?

如何防止将文件包含在系统目录之外?
EN

Stack Overflow用户
提问于 2016-09-01 17:11:00
回答 1查看 316关注 0票数 1

出于安全原因,我必须防止系统目录之外的任何文件的#include。是否有任何限制可以阻止#include<...>#include"..."包含不安全的文件,如#include </dev/tty>#include "/dev/random"

我已经阅读了C前处理器文档的头文件一章以及类似的问题如何防止引用的包含搜索当前源文件的目录?,但是找不到合适的方法。

由于-I-命令已经过时,没有其他方法可以完成相同的功能,所以我可以使用jailkit将代码编译成一个低权限的用户吗?还是有其他方法来确保编译过程的安全性?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-01 17:39:29

godbolt.org通过禁止绝对路径和相对路径#include中解决了一个类似的问题:

输入:

代码语言:javascript
复制
#include "/etc/passwd"

输出:

代码语言:javascript
复制
<stdin>:1:1: no absolute or relative includes please
Compilation failed

在调用编译器之前,可以通过在源代码上运行一个简单的检查程序来实现这一点。对于#include指令,检查器只需要grep,并检查路径以防止违反此类限制。这类脚本的草稿(可用于单个源文件)如下:

check_includes

代码语言:javascript
复制
#!/bin/bash

if (( $# != 1 ))
then
    echo "Usage: $(basename "$0") source_file"
    exit 1
fi

join_lines()
{
    sed '/\\$/ {N;s/\\\n//;s/^/\n/;D}' "$1"
}

absolute_includes()
{
    join_lines "$1"|grep '^\s*#\s*include\s*["<]\s*/'
}

relative_includes()
{
    join_lines "$1"|grep '^\s*#\s*include'|fgrep '../'
}

includes_via_defines()
{
    join_lines "$1"|grep '^\s*#\s*include\s*[^"< \t]'
}

show_and_count()
{
    tee /dev/stderr|wc -l
}

exit_status=0
if (( 0 != $(absolute_includes "$1"|show_and_count) ))
then
    echo 1>&2 "ERROR: $1 contains absolute includes"
    exit_status=1
fi
if (( 0 != $(relative_includes "$1"|show_and_count) ))
then
    echo 1>&2 "ERROR: $1 contains relative includes"
    exit_status=1
fi
if (( 0 != $(includes_via_defines "$1"|show_and_count) ))
then
    echo 1>&2 "ERROR: $1 contains includes via defines"
    exit_status=1
fi
exit $exit_status

假设输入文件可以编译而没有错误,则此脚本标识包含绝对路径或相对路径的#include。它还通过下面这样的宏检测包含(这可以被滥用以绕过路径检查):

代码语言:javascript
复制
#define HEADER "/etc/password"
#include HEADER
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39277331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档