本篇简述一下关于qnx中权限基础知识,以便快速上手查看权限。
QNX 进程管理
QNX中,微内核和进程管理器一起组成procnto
模块,在系统运行时是必需的。
进程管理器可以创建多个POSIX进程。
基本语法
类型定义:type
type xxx_t
通道连接: channel connect
channel connect
用于在xxx_t 类型进程与yyy_t 的通道进行交互时,授予xxx_t 类型进程的权限
allow xxx_t yyy_t : channel connect
通道继承:attach
通道继承以获取其他类型通道的内容
type xxx_t
type yyy_t
allow attach xxx_t /dev/...
allow yyy_t xxx_t : channel connect
上述中,定义了xxx_t
和yyy_t
两个类型。xxx_t
通过attach关键字拥有*/dev/*下所有文件的权限。
通过allow yyy_t xxx_t : channel connect
可以让yyy_t
在不改变其类型的情况下获得xxx_t
对/dev/*
下所有文件的权限
强制更改类型:default_spawn_type
在QNX secpol中,可以将xxx_t 的类型强制更改为yyy_t 的类型,使用方法如下
default_spawn_type xxx_t yyy_t;
settypeid 和gain_priv
由settypeid
切换类型导致带来原来本身类型所不具有的权限,需要通过gain_priv
关键词来添加此能力。
栗子:
当类型xxx_t 中本身不包括/拥有pathspace
的权限,yyy_t 类型包含。此时又使用settypeid
关键词切换到了yyy_t 的类型,这时候就需要使用gain_priv
来对xxx_t 赋予pathspace
的权限了。
如下所示:
allow xxx_t self:ability {
settypeid:yyy_t
channel_connect:yyy_t
gain_priv:pathspace
};
派生类型:derive_type
暂时还在了解中,不过也很重要,在新版本里面
default_rules
能力关键字:ability
带有 ability 关键字的规则为类型授予能力。
栗子:
allow xxx_t self:ability {
mem_phys:0x1200000-0x24000000
setuid:4,6,23
able_create
};
xxx_t 类型具有 内存映射能力/切换uid能力/动态创建能力。
一些常见的能力可以参见下表
一些常见ability
ability | describtion | value |
---|---|---|
io | 申请I/O 特权 | 0/1 |
rlimit | ||
memphy | 内存映射 | 可以是连续/非连续的一段地址空间 |
setuid | 设置userID的值 | |
setgid | 设置groupID的值 | |
able_create | 动态创建的能力 | |
spawn | 创建新进程 | |
pathspace | ||
举个栗子
allow xxx_service_t self:ability {
setuid:ROOT
setgid:ROOT
io:0
#...
};
调试手法
在遇到secpol权限问题时,主要的思路就是见招拆招。
通过cat /dev/secpolgenerate/erros
根据提示添加对应的权限。
当然,QNX的版本不同,有些权限的提示,直接添加可能会导致其他问题。这种情况就需要具体分析,看如何通过其他方法添加或者怎么规避这种获取
tips: 关于语法和权限问题,后续慢慢补充到此篇中
参考链接:https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.security.system/topic/manual/abilities.html
https://www.jianshu.com/p/2be8a12f8cce