问题标签 [setuid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - iPhone应用程序可以以root身份运行吗?
我正在考虑我想创建的 iPhone 应用程序的设计。一个可能的问题是此应用程序必须以 root 身份运行(以访问某些网络端口)。在一个典型的 UNIX 应用程序中,我只是让应用程序使用 setuid 运行,但我想知道这是否可以使用 iPhone 应用程序。
我在 Apple 的论坛上读过这个问题,这令人沮丧:
http://discussions.apple.com/thread.jspa?threadID=1664575
我了解 Apple 想要限制程序的功能,但用户有很多正当的理由以提升的权限运行程序。我不是想在这里创建一个黑客工具。
我确信我可以在越狱的 iPhone 上解决这个问题,但这不是我想要的。有没有办法在完整的 iPhone 上运行具有提升权限的应用程序?
(顺便说一句,没有必要就 NDA 向我发出警告。)
security - 安全访问由环境变量标识的目录中的文件?
任何人都可以指出一些通过环境变量(部分)指定的路径处理文件访问安全性的代码,特别是对于 Unix 及其变体,但 Windows 解决方案也很有趣?
这是一个很长的问题-我不确定它是否适合 SO 范式。
考虑这种情况:
背景:
- 软件包 PQR 可以安装在用户选择的位置。
- 环境变量 $PQRHOME 用于标识安装目录。
- 默认情况下,$PQRHOME 下的所有程序和文件都属于一个特殊的组 pqrgrp。
- 同样,$PQRHOME 下的所有程序和文件要么属于特殊用户 pqrusr,要么属于用户 root(这些是 SUID 根程序)。
- 一些程序是 SUID pqrusr;还有几个程序是 SGID pqrgrp。
- 大多数目录归pqrusr所有,属于pqrgrp;有些可以属于其他组,并且这些组的成员获得使用该软件的额外权限。
- 许多特权可执行文件必须由不是 pqrgrp 成员的人运行;程序必须通过不直接涉及此问题的神秘规则验证是否允许用户运行它。
- 启动后,一些特权程序必须保留其提升的特权,因为它们是长期运行的守护程序,可能在其生命周期内代表许多用户进行操作。
- 由于各种神秘的原因,这些程序无权将目录更改为 $PQRHOME。
当前检查:
- 程序当前检查 $PQRHOME 及其下的关键目录是否“安全”(由 pqrusr 拥有,属于 pqrgrp,没有公共写访问权限)。
- 此后,程序通过环境变量的完整值访问 $PQRHOME 下的文件。
- 特别是,G11N 和 L10N 是通过访问“安全”目录中的文件,并使用从 $PQRHOME 派生的完整路径名加上已知的子结构(例如,$PQRHOME/g11n/en_us/messages.l10n)。
假设 $PQRHOME 的“已安装”值为 /opt/pqr。
已知攻击:
- 攻击者设置 PQRHOME=/home/attacker/pqr。
- 这实际上是 /opt/pqr 的符号链接,因此当其中一个 PQR 程序称为 pqr-victim 检查目录时,它具有正确的权限。
- 安全检查成功完成后,攻击者立即更改符号链接,使其指向/home/attacker/bogus-pqr,这显然在攻击者的控制之下。
- 当 pqr-victim 现在访问所谓的安全目录下的文件时,可怕的事情就会发生。
鉴于 PQR 目前的行为与描述的一样,并且是一个大型程序包(数百万行代码,十多年来针对各种编码标准开发,无论如何这些标准经常被忽略),您将使用什么技术来修复问题?
已知的选项包括:
- 更改所有格式化调用以使用根据格式字符串检查实际参数的函数,并使用一个额外的参数指示传递给函数的实际类型。(这很棘手,并且由于要更改的格式操作数量众多,因此可能容易出错 - 但如果检查功能本身是合理的,则效果很好。)
- 建立到 PQRHOME 的直接路径并验证它的安全性(详细信息如下),如果它不安全,则拒绝启动,然后使用直接路径而不是 $PQRHOME 的值(当它们不同时)。(这要求所有使用 $PQRHOME 的文件操作不使用来自 getenv() 的值,而是使用映射路径。例如,这将要求软件确定 /home/attacker/pqr 是 /opt/pqr 的符号链接, /opt/pqr 的路径是安全的,此后,每当文件被引用为 $PQRHOME/some/thing 时,使用的名称将是 /opt/pqr/some/thing 而不是 /home/attacker/pqr/some /thing。这是一个大型代码库 - 修复起来并不简单。)
- 确保 $PQRHOME 上的所有目录,甚至通过符号链接进行跟踪,都是安全的(再次详细说明如下),如果有任何不安全的地方,软件将拒绝启动。
- 硬编码软件安装位置的路径。(这对 PQR 不起作用;如果不出意外的话,它会使测试变得很糟糕。对于用户来说,这意味着他们只能安装一个版本,并且升级等需要并行运行。这不适用于 PQR。)
安全路径的建议标准:
- 对于每个目录,必须信任所有者。(理由:所有者可以随时更改权限,因此必须信任所有者不要随意更改破坏软件的安全性。)
- 对于每个目录,该组必须没有写入权限(因此该组的成员不能修改目录内容)或者该组必须是受信任的。(理由:如果组成员可以修改目录,那么他们可以破坏软件的安全性,因此他们必须无法更改它,或者必须信任他们不会更改它。)
- 对于每个目录,“其他人”必须对该目录没有写权限。
- 默认情况下,可以信任用户 root、bin、sys 和 pqrusr(其中 bin 和 sys 存在)。
- 默认情况下,可以信任 GID=0(也称为 root、wheel 或 system)、bin、sys 和 pqrgrp 的组。此外,拥有根目录的组(在 MacOS X 上称为 admin)是可以信任的。
POSIX 函数realpath()
提供映射服务,将 /home/attacker/pqr 映射到 /opt/pqr;它不进行安全检查,但只需要在已解析的路径上进行。
那么,以所有这些为背景,是否有任何已知的软件通过模糊相关的回转来确保其安全性?这是不是太偏执了?(如果是这样,为什么 - 你真的确定吗?)
编辑:
感谢您的各种评论。
@S.Lott:攻击(在问题中概述)意味着可以使至少一个 setuid 根程序使用(非特权)用户选择的格式字符串,并且至少可以使程序崩溃,因此很可能可以获得一个根壳。幸运的是,它需要本地 shell 访问;这不是远程攻击。它需要大量的知识才能到达那里,但我认为假设专业知识不“在那里”是不明智的。
所以,我所描述的是一个“格式字符串漏洞”,已知的攻击路径涉及伪造程序,因此尽管它认为它正在访问安全的消息文件,但它实际上会使用消息文件(其中包含格式字符串)受用户控制,不受软件控制。
ruby-on-rails - 从 Ruby on Rails 执行系统任务的最佳方式是什么?
我正在构建一个小型系统管理 Web 应用程序(想想 Web-Min,但在 RoR 中),我需要能够从我的 Ruby 代码中访问系统参数。例如,我想允许用户更改服务器的主机名、时区或网络配置。
我目前的想法是拥有一个单独的 setuid 脚本(Perl、Ruby、??),以便我可以从我的 RoR 代码中调用它并执行操作。这很麻烦,也不是很优雅。我是 Ruby 新手,想知道是否有更好的方法来完成这类事情。
谢谢!
c - 从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行
我需要以 root 身份运行 bash 脚本(无密码 sudo 或 su 不可行),并且由于您无法在 Linux 中设置脚本,因此我考虑从可执行文件中调用它并将其设置为setuid:
这有效 - 就像正确运行脚本一样 - 但脚本以执行“./wrapper”的用户身份运行。
为什么?以及如何正确实现这一点?
谢谢!
perl - 如何使用 Perl 的 Archive::Tar 保存 tar 档案中的 setuid 位?
我正在使用 Perl 的Archive::Tar模块。它保留了文件权限,但不保留粘性位。在我提取档案的另一端,所有的粘性位都消失了。我认为 UNIX/LINUX 操作系统将这些粘性位存储在其他地方。我怎样才能让我的档案也保留粘性位?
使用 -p 开关 tar 保留它,但我如何使用Archive::Tar来做到这一点?我在两边都使用 Perl 的模块。
linux - 是否有任何类 Unix 系统将含义赋予目录上的 SUID 位?
正如标题所说,任何类 Unix 系统是否将含义赋予目录上的 SUID 位,如果是,它是什么意思?
SVTX(保存的文本或粘性)位有一个含义——除非您可以写入文件,否则您不得从此目录中删除文件。例如,它用于 /tmp。
SGID(设置 GID)位有一个含义——在该目录中创建的文件应属于拥有该目录的组(尽管稍后可以通过显式调用 chown(2) 来更改该分配)。
SUID 位呢?
c - 有人使用 BetterAuthorizationSample 吗?
在 OS X 上,特权操作是通过 AuthorizationExecuteWithPrivileges() 完成的,Apple 发布了两个建议:
旧的 MoreAuth 使用 setuid 辅助工具。
当前的 BetterAuthorizationSample 用 launchd 文件在系统中乱扔垃圾。
我不知道使用后者的任何应用程序...
c - 为什么在使用 system() 调用管理程序的 setuid-root C 程序中需要 setuid(0)?
我不得不为某人做一个肮脏的 Linux hack,以便他们可以cupsenable printername
在作为非 root 用户时使用 shell 命令启动打印机。我不希望他们能够以cupsenable
root 身份使用整个语法,所以我只编写了一个 C 包装器来清理输入argv[1]
并调用system("cupsenable sanitizedprintername")
.
我将程序 setuid 设为 root,但即便如此,cupsenable
仍因“权限被拒绝”而失败。然后我在之前插入了一个setuid(0)
电话system()
,你瞧,它起作用了。
忽略有更好的方法让用户控制打印机的问题。可能有更好的方法。我感兴趣的是chmod u+s
vs. setuid(0)
vs.的复杂性system()
。为什么它会这样?
linux - 在 Linux 中仅更改一个线程的 UID/GID
有没有办法在多线程进程中仅更改一个线程的 UID/GID?
这样做的原因是编写一个文件服务应用程序 - 除非调用者的 uid/gid 设置为正确的用户,否则不会强制执行 ACL 和配额,没有使用正确的 uid/gid 创建新文件/目录等。
网络应用程序通常可以在开始时自己 fork() 并在单独的进程中处理每个用户请求。如果需要共享数据,它必须经过某种共享内存。但是,例如 FUSE(linux 用户文件系统)默认使用多线程,并且与 python 绑定结合使用分叉模型是不切实际的。
整个进程的“一致”UID 似乎符合 POSIX 标准,但是旧的 Linux 不遵循 POSIX 并允许不同线程使用不同的 uid。新内核似乎遵循 POSIX,有什么方法可以允许旧的“损坏”行为吗?
c - 设置 setuid 位后程序无法加载
考虑一个可执行文件 A.bin 使用 libY.so 和 libZ.so 的场景。Ac、Yc 和 Zc 都是用 CZc 编写的,Yc 被编译成各自的 .so 文件。
这是文件的目录结构
$home/bin/A.bin $home/lib/libY.so $home/lib/libZ.so
当我以普通用户身份运行 A.bin 时,A.bin 按预期正常运行。注意:$LD_LIBRARY_PATH 包含 $home/lib
我在 Ac 中更改了一些代码,添加了一些需要管理员权限的功能(例如绑定到小于 1000 的端口)。我将 A.bin、libY.so 和 libZ.so 的 setuid 位设置为 rwsrwsrws,并将文件的所有权更改为 root。当我尝试运行 A.bin 时,出现以下错误
ld.so.1:A.bin:致命:libY.so:打开失败:没有这样的文件或目录被杀死
当我从所有这些文件中删除 setuid 权限时,二进制文件会运行,但功能会在需要 root 权限的地方失败。
如何克服这个问题?
编辑:操作系统是 Solaris 5.10