ELF 二进制文件的 INTERP 部分中的 set-uid 和相对路径的组合非常危险。
我不太确定应该如何以及在何处报告这个问题,但在我看来,这像是一个关于 linux/glibc 中动态链接如何工作的一般安全问题,所以让我解释一下它是什么:
考虑构建一个动态链接的二进制文件并在 ELF INTERP 部分指定一个相对路径(使用 --dynamic-linker gcc 选项),以便您可以使用动态链接的商业应用程序重新分发自定义 glibc 版本(不允许您这样做)静态链接到 LGPL glibc,但仍然需要使您的二进制文件在具有不同 glibc 版本的不同 linux 发行版上工作。
如果您将二进制文件chown 为root,并将set-uid 标志放在您的二进制文件上,它实际上变成了rootkit。从不同的目录执行它,允许您替换动态链接器可执行文件,它将以 root 权限执行。
为了演示这一点,请查看以下 C 代码 (issue.c):
#include <stdio.h>
//
// build with:
// gcc -DNAME=\"vulnarable\" -o issue -Wl,--dynamic-linker,.lib64/ld-linux-x86-64.so.2 issue.c
// sudo chown root issue
// sudo chmod u+s issue
// now build some code to be executed with root permissions (we use the same issue.c):
// mkdir -p .lib64/
// gcc -DNAME=\"rootkit\" -o .lib64/ld-linux-x86-64.so.2 --static issue.c
//
int main(int argc, char* argv[])
{
printf("(%s) euid:%d\n", NAME, geteuid());
}
如果您现在像这样执行 set-uid 二进制文件
./issue
甚至只是这样做
ldd issue
而不是得到你可能期望的,例如:
(vulnarable) euid:0
你得到:
(rootkit) euid:0
现在的重点是您可以用任何您喜欢的方式替换 ld-linux-x86-64.so.6 二进制文件。
类似的问题似乎已经解决,方法是不解析 RPATH 中的 $ORIGIN 或如果设置了 set-uid 标志则忽略 LD_LIBRARY_PATH。
所以我想知道是否必须忽略 ELF 中的 INTERP,无论何时设置 set-uid 标志(即通过使用默认动态链接器 -/lib32/ld-linux.so.2 或/lib64/ld-linux -x86-64.so.2)?
那么您认为应该在哪里修复或报告此问题 - 在 glibc 还是内核中?
最佳答案
是的,在不安全的位置使用 setuid 二进制文件指定解释器是不安全的(您提到的是相对路径,但世界可写的固定路径也有同样的问题)。但这是 ELF 设计的合乎逻辑的结论,并且为 setuid 二进制文件添加一个特例来处理 INTERP 并不是可行的方法。这是一个“医生,我这样做的时候很疼。 — 不要这样做。”是的,这种组合是不安全的,所以不要使用它!无论如何,干预 ELF 解释器是相当高级的事情,所以除非您了解自己在做什么,否则您不应该这样做,在这种情况下,您可以从逻辑上得出什么是安全的或不应该做的结论。
ELF/POSIX/Unix/任何东西的高级特性给了你搬起石头砸自己脚的强大方法,因为它们很强大。如果您想摆脱每一种可能的糟糕情况,您的系统将变得更加灵活且难以编程,同时仍然存在一些漏洞。
关于linux - ELF 中 set-uid 和 INTERP(动态链接器)的相对路径的安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9019083/
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
我正在尝试用Prawn生成PDF。在我的PDF模板中,我有带单元格的表格。在其中一个单元格中,我有一个电子邮件地址:cell_email=pdf.make_cell(:content=>booking.user_email,:border_width=>0)我想让电子邮件链接到“mailto”链接。我知道我可以这样链接:pdf.formatted_text([{:text=>booking.user_email,:link=>"mailto:#{booking.user_email}"}])但是将这两行组合起来(将格式化文本作为内容)不起作用:cell_email=pdf.make_c
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO