2. PASE安全基础:IBM i 安全模型回顾、PASE的权限模型、用户配置文件与PASE的交互
好,咱们进入第二章。在真正动手搞PASE漏洞分析之前,得先把地基打牢。很多搞了十几年IBM i的老手,一碰到PASE就懵——说白了,还是没搞懂这套权限模型到底怎么跟传统AS/400那套东西玩到一起的。
我个人习惯是,先回顾一下IBM i本身的安全模型,再去看PASE怎么“寄生”在这个模型里。这样你才能明白,为什么一个PASE进程能访问到DB2库表,为什么一个普通用户能通过PASE提权。
2.1 IBM i 安全模型回顾:别把它当Linux看
IBM i的安全模型,跟Linux、Windows完全是两码事。你想想看,Linux是“一切皆文件”,权限靠UID/GID和DAC/MAC。IBM i呢?它是个基于对象的系统,权限控制的核心是用户配置文件(User Profile)和对象权限(Object Authority)。
这里有几个关键点,我当年刚接触时也踩过坑:
- 用户配置文件(User Profile):相当于Linux的/etc/passwd + /etc/shadow + 用户组,但它还包含了特殊权限(*ALLOBJ、*SECADM等)。一个用户能干什么,全看这个Profile。
- 对象权限:每个对象(文件、程序、数据区)都有独立的权限列表。不像Linux只有owner/group/other三组,IBM i可以给每个用户单独授权。
- 库列表(Library List):这玩意儿在安全里经常被忽略。用户能访问哪些库,由库列表决定。PASE进程的库列表继承自调用它的作业。
- 特殊权限(Special Authorities):*ALLOBJ(所有对象权限)、*SECADM(安全管理)、*JOBCTL(作业控制)等。拥有*ALLOBJ的用户,在PASE里基本就是root。
核心认知:IBM i的安全边界是“用户配置文件”,而不是“进程”。一个用户登录后,他启动的所有作业、所有PASE进程,都共享这个用户的权限。这一点跟Linux的“进程权限分离”完全不同。
2.2 PASE的权限模型:一个“寄生”在IBM i上的Linux
PASE是什么?它不是一个完整的操作系统,而是一个运行时环境。它运行在IBM i的地址空间里,用的是IBM i的内存管理,但跑的是AIX(IBM的UNIX)的二进制程序。
这就带来了一个非常有意思的权限模型:
- PASE进程的“根”是IBM i的用户:每个PASE进程都对应一个IBM i用户配置文件。这个用户有什么权限,PASE进程就有什么权限。
- PASE内部的UID/GID是“假的”:PASE里看到的UID 0(root),其实只是映射到IBM i的某个用户。默认情况下,PASE的root映射到IBM i的QSECOFR用户。但你可以改。
- 文件系统权限是两层:PASE能访问两种文件系统——QOpenSys(类UNIX文件系统)和根文件系统(/)。QOpenSys有它自己的权限位(rwx),但底层还是受IBM i的对象权限控制。
我举个例子你就明白了。假设IBM i上有个用户叫PASEUSER,它没有*ALLOBJ权限。这个用户启动一个PASE shell,然后在里面执行chmod 777 /tmp/test。你以为文件就变成全局可写了?错!因为PASEUSER对/tmp/test这个对象没有*OBJALTER权限,chmod会失败。
避坑指南:我曾经遇到一个案例,开发人员在PASE里用root(映射到QSECOFR)创建了一堆文件,然后普通用户通过PASE去访问,结果报权限错误。查了半天,发现是QSECOFR创建的文件,在IBM i对象层面,普通用户根本没有*R(读)权限。PASE的rwx权限只是“第二道锁”,第一道锁永远是IBM i的对象权限。
2.3 用户配置文件与PASE的交互:映射关系是关键
PASE跟IBM i用户配置文件的交互,是通过一个叫PASE用户映射的机制实现的。这个映射关系定义在/QOpenSys/QIBM/UserData/SC1/OpenSys/etc/passwd和shadow文件里?不,没那么简单。
实际上,PASE的用户映射是硬编码在IBM i的系统值和环境变量里的。核心是以下几个点:
| 组件 | 作用 | 安全影响 |
|---|---|---|
| QIBM_PASE_ROOT_USER | 定义PASE中UID 0(root)映射到哪个IBM i用户 | 默认是QSECOFR,如果改成普通用户,PASE root权限就降级了 |
| QIBM_PASE_DEFAULT_USER | 当PASE进程无法确定当前IBM i用户时,使用的默认用户 | 如果设置不当,可能导致匿名访问 |
| PASE作业的初始用户 | 通过STRQSH、CALL QP2TERM等命令启动PASE时,继承当前作业的用户 | 用户切换(su)在PASE内是受限的,需要特殊配置 |
| QOpenSys文件系统权限 | PASE内看到的rwx权限,但受IBM i对象权限约束 | 容易产生“权限错觉”,以为改了chmod就万事大吉 |
嗯,这里要注意一个细节。PASE里的su命令,跟Linux的su完全不一样。PASE的su实际上是通过调用IBM i的CHGUSRPRF或SWITCH API来切换用户。这意味着,如果你在PASE里想从PASEUSER切换到QSECOFR,你必须知道QSECOFR的密码,而且IBM i的安全策略(比如密码复杂度、账户锁定)都会生效。
个人经验:我在做渗透测试时,经常利用这个映射关系。如果目标系统把PASE的root映射到了一个拥有*ALLOBJ权限的IBM i用户(比如QSECOFR),那我只要在PASE里拿到一个shell,就相当于拿到了整个系统的最高权限。反过来,如果映射的是一个普通用户,那PASE的漏洞影响范围就小得多。
2.4 核心逻辑图:PASE权限模型全景
下面这张图,我建议你多看几遍。它把IBM i用户、PASE进程、文件系统权限之间的关系画清楚了。
2.5 实战中的权限检查清单
好了,理论讲完了。咱们来点实际的。当你拿到一个IBM i系统,想评估PASE的安全状况,我建议按这个顺序检查:
- 检查PASE root映射:运行
echo $QIBM_PASE_ROOT_USER,看它映射到哪个IBM i用户。如果是QSECOFR,危险等级直接拉满。 - 检查默认用户映射:
echo $QIBM_PASE_DEFAULT_USER,如果没设置或者设置成*NONE,可能会有匿名访问风险。 - 检查PASE内UID 0的进程:在PASE shell里运行
ps -ef | grep '^root',看哪些进程以root身份运行。然后去IBM i端查这些进程对应的作业,看它们到底是谁启动的。 - 检查QOpenSys文件系统的关键文件:比如
/etc/passwd、/etc/shadow、/QOpenSys/QIBM/UserData/SC1/OpenSys/etc/下的文件,看权限是否被过度放开。 - 检查SUID/SGID程序:PASE里也有SUID位。运行
find / -perm -4000 -o -perm -2000,看有没有可疑的SUID程序。这些程序在PASE里提权后,可能通过调用IBM i API进一步提权。
核心结论:PASE的安全,本质上就是IBM i用户配置文件的安全。你只要管好了IBM i的用户、特殊权限和对象权限,PASE再折腾也翻不出大浪。反过来,如果IBM i的用户权限管理一塌糊涂,PASE就是那个最容易被利用的突破口。
嗯,这一章的内容就到这里。记住这张权限模型图,后面讲具体漏洞的时候,你会反复用到它。