有谁发现这个程序有什么问题吗

2024-02-12

在没有得到我喜欢的答案后这个关于 chroot 的问题 https://stackoverflow.com/questions/3737008/how-run-in-a-chroot-jail-not-as-root-and-without-sudo,我去推出了自己的解决方案:

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
extern char **environ;

int main(int argc, char** argv, char** envp) {
  char* path = "/";
  char* name = "nobody";
  char* exe = "/bin/false";
  struct passwd *pass;

  if(argc < 4) { printf("Need more args: username chroot exe args...\n"); return 1; }
  name = argv[1];
  path = argv[2];
  exe = argv[3];

  if(!(pass = getpwnam(name))) { printf("Unknown user %s", name); return 2; }

  if(chroot(path)) {
    if(errno == EPERM) { printf("chroot not allowed\n"); return 3; }
    printf("chroot failed\n");
    return 4;
  }
  chdir("/");

  if(setgid(pass->pw_gid)) { printf("setgid failed: %d\n", pass->pw_gid); return 5; }
  if(setuid(pass->pw_uid)) { printf("setuid failed: %d\n", pass->pw_uid); return 6; }

  environ = envp;
  execvp(exe, argv + 3);

  printf("exec of %s failed\n", exe);
  return 7;
}

有没有人看到其中的任何错误(或者更好的是,知道有一个工具可以使它变得多余)?


  1. 为什么要指定默认值path, name, exe,如果你还是覆盖它们呢?
  2. 您不应该从内部返回负值main()。它使实际返回值不清楚,因为 POSIX 仅使用它的 8 个最低有效位(即-1返回为255, etc.).
  3. 你不应该依赖getuid(); chroot()会工作CAP_SYS_CHROOT能力也。相反,你可以尝试chroot()并检查是否errno == EPERM.
  4. chroot()不改变当前工作目录;我想你应该打电话chdir() too.
  5. 什么是environ = envp作业究竟是做什么的?看起来很老套。
  6. 无论如何,您都可以添加更好的错误报告。

最后,chrootuid http://ftp.porcupine.org/pub/security/index.html#software可能是您正在寻找的工具。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有谁发现这个程序有什么问题吗 的相关文章

  • 在 bash 中重命名文件的陷阱

    我正在这里阅读指南http mywiki wooledge org BashFAQ 030 http mywiki wooledge org BashFAQ 030在这个链接上给出了一些例子我试图理解它们一个示例代码说 Bash Repla
  • 信号执行期间的 sigprocmask

    我目前正在研究使用sigprocmask阻止某些信号 在这种情况下 SIGALRM and SIGCHLD 当关键代码段正在执行时 与这些信号关联的两个信号处理程序都将访问和修改中央数据结构 因此在主进程处理该数据结构时阻止它们访问它至关重
  • 有没有通过 fstat() 的 POSIX 方法来检查文件是否是符号链接?

    有没有 POSIX 方式通过fstat 2 检查文件是否是符号链接 有旗帜O NOFOLLOW in open 2 可以检查它 但是 它不是 POSIX 有S ISLNK in fstat 2 其中说man fstat The S ISLN
  • Python:“导入 posix”问题

    如果我导入os模块 我可以运行以下命令来推断 os py 的位置 gt gt gt import os gt gt gt print os file usr lib python2 6 os pyc 但是 当我导入时posix 它不具有 f
  • C库函数获取活动线程数

    我正在用 C 语言开发一个多线程 Unix 应用程序 有没有一种简单的方法来获取同时活动线程的数量 如果库已经可以为我完成的话 我不想编写代码来跟踪活动线程的数量 我正在使用 POSIX pthreads 并且我正在尝试为 Unix 和类
  • 如何在 Bash shell 脚本中检查目录是否存在?

    什么命令检查 Bash shell 脚本中的目录是否存在 检查目录是否存在 if d DIRECTORY then echo DIRECTORY does exist fi 检查目录是否不存在 if d DIRECTORY then ech
  • 如何移植使用“${@:2}”?

    On 允许在变量赋值中使用 2 语法 https github com koalaman shellcheck issues 214他们说我不应该使用 2 因为它会破坏不同外壳的东西 我应该使用 2 反而 但使用 2 代替 2 是无稽之谈
  • Linux 中 POSIX 可靠信号和 POSIX 实时信号有什么区别?

    我读了一个手册页signal using 男人7信号 http man7 org linux man pages man7 signal 7 html我看到两种类型的信号 所以 我有一个问题 有什么区别POSIX 可靠信号 and POSI
  • 对于有多个孩子的单亲,正确使用 fork() 和 pipeline() 。我该如何正确地做到这一点?

    So my 上一篇文章 https stackoverflow com questions 26321100 concept any good c example of fork pipe where one parent creates
  • 如何测试文件是否被锁定和/或只读而不打开?

    是否有可移植的 std filesystem 方法来测试文件是否 锁定 或具有 只读 权限 例如 MacOS Finder 具有 锁定 设置 这与标准 POSIX 权限 不同 在尝试执行删除操作之前 我需要测试是否可以删除文件 理想情况下
  • 在 Perl 中使用 POSIX ceil() 出现意外结果

    我一生都无法弄清楚为什么以下会产生这样的结果 use POSIX my g 6 65 my t g 4 my r t g my n r g my c ceil n print c n n 我知道印记太棒了 抱歉 我已经为我的应用程序解决了这
  • osx 上的 aio:它是在内核中实现还是通过用户线程实现?其他选择?

    我正在开发我的小型 C 框架 并且有一个文件类 它也应该支持异步读写 除了在我发现的一些工作线程中使用同步文件 I O 之外 唯一的解决方案是 aio 无论如何 我环顾四周并在某处读到 在 Linux 中 aio 甚至不是在内核中实现的 而
  • POSIX:FreeBSD 与 Linux 中的管道系统调用

    在 Linux 2 6 35 22 generic 中 man pipe指出 pipeline 创建一个管道 一个可用于进程间通信的单向数据通道 在 FreeBSD 6 3 RELEASE p5 中 man pipe指出 pipeline
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 同步 I/O 是否会使线程繁忙?

    假设我正在同步 I O 套接字上执行 I O 该套接字已准备好read or write手术 这意味着调用线程不会在操作上被阻塞 无论非阻塞 SOCK NONBLOCK 套接字的阻塞性质 但以下事情我不清楚 实际转移何时发生 当套接字标记为
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • 命名和未命名的 posix 信号量

    计划使用 posix 信号量来同步 2 个进程 不太确定使用哪个 命名或未命名 各自的优点和缺点是什么 我如何决定使用哪个 在哪些情况下 其中一种优于另一种 Thanks 如果两个进程不相关 您应该使用命名信号量 如果两个进程相关 即分叉
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 使用 execv 和输入重定向的 C++ 管道命令

    尝试编写一个处理内部和外部命令的 shell 我一次可以获得内部命令和一个外部命令 我的问题是如何运行这样的命令 ls l grep lib wc l 我正在使用 fork 并通过 char 中的 execv 传递外部命令 关于如何工作有什
  • 为什么libc中没有gmtime的反函数?

    在 libc 中 有两个函数可以将系统时间转换为日历时间 gmtime and localtime 但只有localtime有反函数 mktime 为什么没有反函数gmtime 如果不应该有 为什么gmtime exists 我发现这段代码

随机推荐

  • 使用 WebGL 进行 2D 图像处理

    我打算用 JS 创建一个简单的照片编辑器 我的主要问题是 是否可以创建实时渲染的滤镜 例如 调整亮度和饱和度 我所需要的只是一个 2D 图像 我可以在其中使用 GPU 应用滤镜 我读过的所有教程都非常复杂 并且没有真正解释 API 的含义
  • Go的类型推断算法

    Go编译器使用什么类型推断算法 我尝试在 golang 上查找此内容 但找不到文档 我很想假设这将是欣德利 米尔纳 但我想确定一下 Go 当然不使用 Hindley Milner 你为什么那么想 实际上 Go 一般没有类型推断 仅与 构造
  • 如何创建本地主机服务器来运行 AngularJS 项目

    我使用 XAMPP 和 JetBrains WebStorm 来运行 AngularJS 项目 但结构复杂 性能低下 还有其他方法来运行 AngularJS 项目吗 如果您正在运行node jshttp服务器 https www npmjs
  • 使用 jest.useFakeTimers() 时,为什么 setImmediate 不会无限期超时?

    使用时jest useFakeTimers 为什么setTimeout and setImmediate 表现不同 beforeAll jest useFakeTimers afterAll jest useRealTimers descr
  • 如何在 Hbase 中连接两个表

    Problem 我是 Hbase 新手 遇到了需要连接两个表的情况 假设我有 Employee 表和 Department 表都是在 Hbase 中创建的 通过阅读 Hbase 的实际操作 我了解到我们无法连接 Hbase 中的表 解决方案
  • 将元素添加到 Iframe

    我正在创建一个包含 iframe 的页面 我的目标是创建一个将添加到 iframe 内容头部的 javascript 但我总是收到暗示 iframe contentDocument 为空的错误 主页代码
  • 无法操作 jQuery 中 ajax 请求插入的数据

    调用服务器并将其返回的数据转换为表后 我使用 jQuery 的 html 语法将其插入页面中 之后数据出现在页面中 但我无法使用 jQuery 操作它 继承人的代码
  • 在 numpy 中使用 2d 掩码掩码 3d 数组

    我有一个 3 维数组 我想使用一个 2 维数组来屏蔽它 该数组的维度与 3 维数组最右边的两个数组的维度相同 有没有办法在不编写以下循环的情况下执行此操作 import numpy as np nx 2 nt 4 field3d np ra
  • 同一角色的实例之间的 Azure 网络通信

    同一角色的多个角色实例是否可以通过获取所有这些实例侦听的特定端点的 VIP 虚拟 IP 地址来相互通信RoleEnvironment 如果是这样 返回的 VIP 可以负载均衡到调用者 的RoleEnvironment方法 实例本身 角色实例
  • 设置 UINavigationbar 的标题不起作用

    我浏览了一些在线教程 但没有任何效果 这是我的 viewController 的代码 import UIKit class ViewController UINavigationController let textView UITextV
  • 在 MySQL 中查找下一个可用的 id

    我必须在 MySQL 数据库中找到下一个可用的 id 如果数据库中有 5 个数据 我必须获取下一个可用的插入位置 即 6 我怎样才能做到这一点 我用过MAX id 但是当我从数据库中删除一些行时 它仍然保留未更新的旧最大值 更新2014 1
  • Flask|Jinjia2|Javascript:将 Flask 模板变量传递到 Javascript

    将变量从 Flask 模板传递到 Javascript 文件的最佳方法是什么 这是我的代码 我的网络应用程序中有一个简单的视图 webapp route bars def plot d3 bars return render templat
  • 奇数个 a 的正则表达式

    我在解决以下练习时遇到问题 希望得到任何帮助 令 a b 我需要为包含奇数个 a 的所有字符串给出一个正则表达式 感谢您的时间 b ab ab ab 它的主要部分是 ab ab 它枚举了偶数个的所有可能性as 最后 还有一个额外的a必须存在
  • 将 MIME 转换为 RichText

    我想转换多米诺骨牌文档字段Data Type MIME Part into a Data Type Rich Text in backend with SSJS or Java 我尝试过与 doc computeWithForm true
  • 无法解析 RubyMine 中的文件

    我正在尝试将 RubyMine v6 3 3 用于我的 Rails 项目 我添加后bootstrap sass宝石根据其说明 在https github com twbs bootstrap sass https github com tw
  • GWT Maven 插件 -- gwt:run 可以工作,但 gwt:compile 不能。为什么?

    我正在使用 gwt maven plugin 来管理 GWT 项目 我用gwt run目标始终以 开发模式 本地运行进行测试 我现在想将我的项目编译成 war 以部署在 Tomcat 上 当我跑步时gwt compile但是 我收到编译错误
  • 从自定义指令 VueJS 更新模型

    我目前使用 Vue JS 2 0 我想从自定义指令更新一个 Vue 实例的模型 但我正在寻找一种很好的方法来做到这一点 这是因为我试图创建一个实现 JQueryUI Datepicker 代码的自定义指令如下
  • 指向匿名联合体的指针的强制转换在 C11 中有效吗?

    const Boo constBoo Boo nonConstBoo nonConstBoo union const Boo q Boo nq constBoo nq 上述构造在 C11 中有效 还是只有 GCC clang 扩展才能以这种
  • filter_var_array() 多维数组

    有什么想法为什么这行不通吗 POST array edit gt array name gt test die var dump filter var array POST array edit name gt FILTER SANITIZ
  • 有谁发现这个程序有什么问题吗

    在没有得到我喜欢的答案后这个关于 chroot 的问题 https stackoverflow com questions 3737008 how run in a chroot jail not as root and without s