一般来说,unix(或者特别是 Linux)程序不能执行类似使用 ICMP_ECHO(“ping”)来检查路由器的可访问性的操作,除非由超级用户或setuid root运行或具有适当的 POSIX 功能。显然,在任何正常运行的系统上,将 setuid 或 POSIX 功能应用于二进制文件都需要超级用户干预。
如果开发环境拥有 CAP_SETFCAP 功能,那么它应该能够在其构建的程序上设置适当的 POSIX 功能,至少就本地操作而言。
赞同 Ken Thompson 的《关于信任信任的反思》论文并假设所有库的静态链接,原则上应该可以在每个程序源模块中构建指纹,将其传播到对象和二进制文件,从而提供审计跟踪表明特定的二进制文件是从特定的源集合构建的。因此,要求祝福新建的 IDE 副本的管理员应该能够满足自己的要求,即 IDE 只能在它自己生成的程序中设置功能,并且不会被恶意用户修改,以便他可以通过例如未记录的启动选项将其用作 setcap 的个人副本。
这里的问题是,大多数成熟的开发环境(例如Lazarus IDE)可以自行构建,因此,如果本地管理员使用 CAP_SETFCAP 祝福可证明干净的副本,则恶意用户可以重建它以包含恶意代码并自己将 CAP_SETFCAP 应用于它,破坏本地系统安全。
是否可以将 POSIX CAP_SETFCAP 功能应用于二进制文件,使其无法传播到新建程序的是另一个 CAP_SETFCAP 或其超集功能之一?
我正在阅读为 Bourne shell 编写的 Maven 包装器的源代码。我遇到过这些行:
if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "$(expr "$javaExecutable" : '\([^ ]*\)')" = "no" ]; then
# snip
Run Code Online (Sandbox Code Playgroud)
expr
当与arg1
and一起使用时arg2
, a 与正则表达式:
匹配。通常,结果是匹配字符的数量,例如:arg1
arg2
$ expr foobar : foo
3
Run Code Online (Sandbox Code Playgroud)
但是,当使用捕获括号 (\(
和\)
) 时,它返回第一个捕获括号的内容:
$ expr foobar : '\(foo\)'
foo
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。
如果我在我的机器上评估上面引用的源中的表达式,我会得到:
$ javaExecutable=$(which javac)
$ expr "$javaExecutable" : '\([^ ]*\)'
/usr/bin/javac
Run Code Online (Sandbox Code Playgroud)
对于不存在的可执行文件:
$ …
Run Code Online (Sandbox Code Playgroud) bourne-shell ×1
capabilities ×1
development ×1
history ×1
linux ×1
security ×1
shell ×1
which ×1