Ram*_*Ram 3 environment-variables
我在 openssh/telnet 代码中使用以下设置用户环境。
setenv("TEST_ENV", "testing", 1);
Run Code Online (Sandbox Code Playgroud)
但这可以由用户修改,无论如何使它成为只读环境变量?
可以使用命令在 POSIX 兼容 shell 中设置只读变量readonly。
readonly VAR=foo # POSIX
declare -r VAR=foo # bash
export VAR
Run Code Online (Sandbox Code Playgroud)
这绝不是阻止用户更改它的安全功能。用户始终可以生成新的 shell 并更改变量。
在传统的进程环境中没有任何东西可以使变量只读,只有 shell 对它们自己的环境/变量有这个概念(两者在某种程度上重叠,但它们必须被理解为不同的)。这同样适用于整数、数组、函数等类型属性。
您是否考虑过使用受限制的外壳,例如rbash?您可以在其启动脚本中设置rbash运行readonly TEST_ENV)。rbash虽然可能过于严格,但它在很大程度上解决了评论中提出的问题。
环境是每个进程的读/写部分(详见此处和此处),进程不仅可以直接写入数据部分(通过environ[]),还可以更改指向它的指针。如果您精通汇编并且可以找到解决crt启动代码的方法,您可能可以对此做一些事情(即重新定位到只读页面),但我不推荐它;-)
如果用户运行的特定命令必须具有特定环境,您可以只设置 group-execute and usesudo来设置正确的变量(例如 via/etc/environment或env_file指令)并作为特定组运行命令(保留 uid)。noexec大多数平台上的最新版本都支持,可用于阻止运行新的 shell(尽管可以破坏合法的程序fork()和exec())。
作为最后一个选项,您可以使用LD_PRELOAD自己的库通过包装相关的 libc 函数(getenv() putenv()等)为某些/所有用户进程设置受控环境。libfaketime正是针对与时间相关的 libc 函数执行此操作的。有一个不太知名的工具叫做timetravel,它有类似的作用,但也有钩子setenv(),getenv()以便LD_PRELOAD在逆境中保持控制。
最可靠的方法是过滤setenv() unsetenv() putenv()(可能还有clearnv())调用以防止修改,并过滤getenv()以使其始终返回所需的值(可能来自文件)。这种方法不会阻止通过 直接操作环境内存environ[],但只要您控制getenv()依赖于 libc API的任何进程,就应该看到您的价值。初始化时直接bash使用environ[],但也调用getenv().
| 归档时间: |
|
| 查看次数: |
16700 次 |
| 最近记录: |