gpt4 book ai didi

c++ - 如何防止从系统目录中包含文件?

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:17 24 4
gpt4 key购买 nike

我必须防止 #include出于安全原因,将任何文件移出系统目录。有没有什么限制可以防止#include<...>#include"..."包括不安全的文件,如 #include </dev/tty>#include "/dev/random"

我已经阅读了Docs of C Preprocessor的头文件章节以及类似的问题How do I prevent a quoted include from searching the directory of the current source file?但找不到合适的方法。

-I-命令已过时,没有其他方法可以完成相同的功能,我可以使用 jailkit 以低权限用户身份编译代码吗?还是有其他方法保证编译过程的安全?

最佳答案

godbolt.org通过 forbidding absolute and relative paths 解决了类似的问题在 #include 中:

输入:

#include "/etc/passwd"

输出:

<stdin>:1:1: no absolute or relative includes please
Compilation failed

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

check_includes:

#!/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。它还检测通过如下宏完成的包含(这可以被滥用来绕过路径检查):

#define HEADER "/etc/password"
#include HEADER

关于c++ - 如何防止从系统目录中包含文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com