capabilities: ambient capabilities说明

2023-05-16

linux capability介绍

最早之前,linux对任务权限分为privileged processes(UID等于0,属于超级用户或者root用户)和unprivileged processes(UID非0)。privileged processes拥有系统的所有权限,而unprivileged processes拥有部分权限(根据进程凭证,比如effective UID, effective GID,and supplementary group list)。

Linux自2.2版本以后,加入了capabilities功能,将这些特权分为不同的种类,比如

  • CAP_KILL:拥有kill进程的权限
  • CAP_SETFCAP:拥有配置文件capabulities属性的权限
  • CAP_SYS_BOOT:运行reboot和kexec_load的权限
  • CAP_SYS_MODULE:模块相关操作的权限

(更多介绍:参考文档3中“Capabilities list”介绍)
内核细分的这些权限,不再根据超级用户/普通用户来划分归属,而是可以由用户自由配置(配置还是要超级用户权限滴),即使普通用户也可以做某些之前超级用户才可以执行的任务(比如reboot)。同时capabilities可以细分到线程,支持子进程或者创建线程继承capabilities属性。

每个线程拥有四个capability sets:
(1)Permitted(pP):规定该线程的capabilities能力的全集,即表示线程能够使用的能力的集合。它并不使能线程的capabilities,而是作为一个规定。
(2)Effective(pE):使能该线程的capabilities能力。当线程进行某个特权操作时,系统会检查effective对应位是否有效。如有效,则允许执行。
(3)Inheritable(pI):线程通过execve(2) 执行新命令时,新命令集成的capabilities能力。
(4)bounding set(X):关闭线程的capabilities能力。(此项在capabilities的man文档中并未和上面三个并列,但是在patch中提及,属于capabilitiy sets一员)

举例来说,
某线程设置Permitted:CAP_KILL,CAP_SETFCAP和CAP_SYS_BOOT,那么此线程最大能拥有这些权限。
如果想让它拥有重启系统的权限(CAP_SYS_BOOT),那么Effective设置CAP_SYS_BOOT即可(另外两项可以不设置)。如果想要拥有Permitted定义以外的权限,比如CAP_WAKE_ALARM ,那么Effective会设置失败。
如果希望execve(2)执行新的命令有重启系统权限,那么设置Inheritable:CAP_SYS_BOOT即可。
(更多介绍:参考文档3中“Thread capability sets”介绍)

同时文件也可以拥有capabilities权限,Permitted(fP),Effective(fE)和Inheritable(fI)。
使用execve(2)执行的新命令继承权限遵循:

        pP' = (X & fP) | (pI & fI)   
        pI' = pI
        pE' = (fE ? pP' : 0) 
       X is unchanged

where:

       P         denotes the value of a thread capability set before the
                 execve(2)

       P'        denotes the value of a thread capability set after the
                 execve(2)

       F         denotes a file capability set

       cap_bset  is the value of the capability bounding set (described
                 below).

解读:
pP’ = (X & fP) | (pI & fI)
execve(2)执行新任务的P’(permitted),是基于fP&X(总集-bounding未使能)与pI & fI(线程和文件属性inheritable取与,inheritable表示子任务应该拥有的capabilities)的取或。

pI’ = pI
execve(2)执行新任务的P’(inheritable),继承原任务的P(inheritable)

pE’ = (fE ? pP’ : 0)
execve(2)执行新任务的P’(effective),根据F(effective)
(文件effective是否设置),设置则继承新任务的P’(permitted),否则无capabilities(即新任务未使能任何权限,但是还是可以根据pP’再调用cap_set使能)。

以上更多介绍,可以见:参考文档3和参考文档4。

内核capabilities机制存在的问题

1.引入管理混乱。举例来说如果非特权进程设置fE后,它将遵循“secure exec”规则:AT_SECURE被设置后,LD_PRELOAD就不会生效;
2.安全问题。给非特权进程提供特权用户的某些权限,这样增加了黑客攻击的通道。黑客很可能利用capabilities里面漏洞进行提权操作。
3.inheritance是基本无用的。如果你非特权用户或者二进制文件,并且fI未使能时,此时意味着你无法通过execve(2)执行一个帮助程序或者超出权限的命令。同时一般来说,我们希望进程包括创建的子进程拥有同样的权限,此时经常被设置成pP’ = pI。但是这样的话,你又要考虑每个非特权进程的权限问题等等。

ambient capabilities

linux4.3内核新增了一种capability mask,“ambient”(pA)。pA完成了用户对pI的不足。

pA具有如下特性:
(1)pP和pI未设置的capabilities,pA也不能设置,即pA不能使能超出pP&pI的特权;
(2)当pP或者pI某权限(比如CAP_SYS_BOOT权限)关闭后,pA也随之关闭对应权限,这样确保降低权限时候,子任务可以同时降低;
(3)当使用setresuid将用户从特权用户切换到非特权用户时,pA将被清除(设置SECBIT_NO_SETUID_FIXUP后不会被清除);

权限规则被修改成:

           pA' = (file caps or setuid or setgid ? 0 : pA)
           pP' = (X & fP) | (pI & fI) | pA'
           pI' = pI   pE' = (fE ? pP' : pA')
           X is unchanged

非特权用户如果有一个capability,那么可以添加到pA。如果这样做,那么它子进程可以在pA,pP和pE中获取这种能力。举例来说,如果你设置pA = CAP_NET_BIND_SERVICE,那么你子进程可以自动连接到low-bumbered ports。

linux对应commit提供了测试用例,ambient_test.c

/*
 * Test program for the ambient capabilities. This program spawns a shell
 * that allows running processes with a defined set of capabilities.
 *
 * (C) 2015 Christoph Lameter <cl@linux.com>
 * Released under: GPL v3 or later.
 *
 *
 * Compile using:
 *
 *  gcc -o ambient_test ambient_test.o -lcap-ng
 *
 * This program must have the following capabilities to run properly:
 * Permissions for CAP_NET_RAW, CAP_NET_ADMIN, CAP_SYS_NICE
 *
 * A command to equip the binary with the right caps is:
 *
 *  setcap cap_net_raw,cap_net_admin,cap_sys_nice+p ambient_test
 *
 *
 * To get a shell with additional caps that can be inherited by other processes:
 *
 *  ./ambient_test /bin/bash
 *
 *
 * Verifying that it works:
 *
 * From the bash spawed by ambient_test run
 *
 *  cat /proc/$$/status
 *
 * and have a look at the capabilities.
 */

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <cap-ng.h>
#include <sys/prctl.h>
#include <linux/capability.h>

/*
 * Definitions from the kernel header files. These are going to be removed
 * when the /usr/include files have these defined.
 */
#define PR_CAP_AMBIENT 47
#define PR_CAP_AMBIENT_IS_SET 1
#define PR_CAP_AMBIENT_RAISE 2
#define PR_CAP_AMBIENT_LOWER 3
#define PR_CAP_AMBIENT_CLEAR_ALL 4

static void set_ambient_cap(int cap)
{
    int rc;

    capng_get_caps_process();
    rc = capng_update(CAPNG_ADD, CAPNG_INHERITABLE, cap);
    if (rc) {
        printf("Cannot add inheritable cap\n");
        exit(2);
    }
    capng_apply(CAPNG_SELECT_CAPS);

    /* Note the two 0s at the end. Kernel checks for these */
    if (prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_RAISE, cap, 0, 0)) {
        perror("Cannot set cap");
        exit(1);
    }
}

int main(int argc, char **argv)
{
    int rc;

    set_ambient_cap(CAP_NET_RAW);
    set_ambient_cap(CAP_NET_ADMIN);
    set_ambient_cap(CAP_SYS_NICE);

    printf("Ambient_test forking shell\n");
    if (execv(argv[1], argv + 1))
        perror("Cannot exec");

    return 0;
}

编译执行:

#gcc -o ambient_test ambient_test.c -lcap-ng
(-lcap-ng使用时cap-ng.h: No such file or directory错误,请 sudo apt-get install libcap-ng-dev)
#sudo setcap cap_net_raw,cap_net_admin,cap_sys_nice+p ambient_test
#./ambient_test /bin/bash
#cat /proc/$$/status

CapInh: 0000000000803000
CapPrm: 0000000000803000
CapEff: 0000000000803000
CapBnd: 0000003fffffffff
CapAmb: 0000000000803000  
CapAmb表示ambient特性,此时execv进入的新的shell环境,pI,pP和pE集成原来的pA。

参考文档:
(1) https://lwn.net/Articles/632520/
(2) https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08
(3) http://man7.org/linux/man-pages/man7/capabilities.7.html
(4) https://www.cnblogs.com/iamfy/archive/2012/09/20/2694977.html
这里写图片描述

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

capabilities: ambient capabilities说明 的相关文章

  • 重签名ipa步骤及工具

    au signer win工具可以实现在Windows电脑直接重签名ipa xff0c 无需苹果电脑 xff01 对现用的ipa文件进行重签 xff0c 实现达到可以安装自己苹果手机的目的 扩展功能可以设置签名时间控制 xff0c 可以去除
  • Linux下Nacos安装集群配置及Mysql持久化配置

    安装配置1个ngix 43 3个nacos注册中心 43 1个mysql 一 Nacos下载安装 1 下载地址 xff1a https github com alibaba nacos releases tag 1 3 1 2 解压 把下载
  • centos 安装redis踩的两个坑

    redis 安装就不说 xff0c 面向百度编程 xff0c 主要记录下两个重要的点 xff1a 1 设置redis 密码 找到redis安装目录 xff0c 进入下面的bin目录 xff0c 找到redis conf文件 编辑redis
  • centos7安装mysql 8.0 简单全过程

    一 安装 依次执行以下命令 xff0c 遇到选项选Y span class token function sudo span yum localinstall https repo mysql com mysql80 community r
  • nacos注册地址服务名找不到问题记录

    项目构成 xff0c nacos 43 gateway 43 openfeigns xff0c 在做配置的时候使用服务名 xff08 spring application name xff09 找不到服务器 问题解决 xff1a 调用的微服
  • 做设计师还是程序员?一张图你就明白!

    平时大家相安无事 xff0c 可一旦项目滑了水 栽了坑 二重奏就开始没完没了的唱起来了 请看下图 xff1a 你的桌子是有什么 小编反手一摸 xff0c 还好小编的头发还再 你头发呢 xff1f 相信这里有很多学习java的朋友 xff0c
  • 查看数据库当前编码【Mariadb、Mysql、Flask】

    情景 在centos下部署flask项目 xff0c 使用的是mariadb xff0c xff08 本地mysql香香的 xff09 xff0c 用到sqlarchemy xff0c 插入前中文 xff0c 出入后查询乱码 xff0c 最
  • JVM之调优篇

    内存泄漏与内存溢出 内存溢出 指在程序申请内存时 xff0c 没有足够的内存可以分配 xff0c 就是OOM xff0c 即使垃圾回收之后也不能有足够的空间分配 内存泄漏 Memory Leak 是指在程序运行后 xff0c 没有释放所占用
  • 使用document解析xml文件

    在慕课上课时 xff0c 看到可以使用document来解析xml文件 xff0c 把上课的代码放出来 xff0c 先记录一下 大概步骤如下 xff1a 1 使用DocumentBuilderFactory 创建对象后再创建Document
  • 【STM32】HAL库开发教程(四)—串口FIFO使用

    前言 不必害怕未知 xff0c 无需恐惧犯错 xff0c 做一个Creator xff01 本文主要介绍STM32 HAL库开发中串口 FIFO的使用 一 开发步骤 1 Cubemx配置 在左侧引脚配置栏选择目标串口号在串口模式处配置串口模
  • mysql报错ORDER BY clause is not in SELECT list, references column ‘‘which is not in SELECT list解决方案

    mysql报错Expression 1 of ORDER BY clause is not in SELECT list references column 39 fusion m create time 39 which is not i
  • 文件管理

    彩蛋 操作系统总目录 戳我 文章目录 1 初始文件管理2 文件的逻辑结构无结构文件有结构文件顺序文件是否可以实现记录的随机存取变长记录定长记录 索引文件索引顺序文件多级索引顺序文件 3 文件目录文件控制块需要对目录进行哪些操作 目录结构单级
  • 设备管理

    彩蛋 操作系统总目录 戳我 文章目录 I O设备的基本概念与分类什么是I 0设备 I O设备分类按使用特性分类按照传输速度分类按照信息交换的单位分类 I O控制器I 0设备的机械部件I 0设备的电子部件 I 0控制器 I O控制器的组成内存
  • 进程管理

    彩蛋 操作系统总目录 戳我 进程 进程的概念 进程的定义 程序 就是一个指令序列 程序段 数据段 PCB三部分组成了进程实体 进程映像 一般情况下 xff0c 我们把进程实体就简称为进程 例如 xff0c 所谓创建进程 xff0c 实质上是

随机推荐

  • 哲学家进餐问题

    文章目录 哲学家进餐问题问题描述问题分析思想三代码小结 哲学家进餐问题 问题描述 一张圆桌上坐着5名哲学家 xff0c 每两个哲学家之间的桌上摆一根筷子 xff0c 桌子的中间是一碗米饭 哲学家们倾注毕生的精力用于思考和进餐 xff0c 哲
  • 进程同步和互斥

    彩蛋 操作系统总目录 戳我 文章目录 进程互斥的硬件实现方法中断屏蔽方法TestAndSet指令Swap指令小结 信号量机制信号量机制 整型信号量信号量机制 记录型信号量小结 用信号量机制实现信号量机制实现进程互斥信号量机制实现进程同步信号
  • Java Future

    Callable Doug Lea 大师 xff0c 在1 5的杰作 span class token comment 64 see Executor 64 since 1 5 64 author Doug Lea 64 param lt
  • 布隆过滤器

    网页黑名单 垃圾邮件过滤系统 爬虫网站判重 哈希函数 特征 xff1a 典型的哈希函数都有无限的输入值域 当给哈希函数传入相同的输入值时 xff0c 返回值一样 当给哈希函数传入不同的输入值时 xff0c 返回值可能一样 xff0c 也可能
  • mysql45讲知识框架图

    1 一条SQL查询语句是如何执行的 xff1f 在有些场景下 xff0c 执行器调用一次 xff0c 在引擎内部则扫描了多行 xff0c 因此引擎扫描行数跟rows examined并不是完全相同的 主要讲述mysql 服务器和存储引擎之间
  • session 和 cookie

    一 区别 存储位置不同 xff1a session 存储在服务器端 xff1b cookie 存储在浏览器端 安全性不同 xff1a cookie 安全性一般 xff0c 在浏览器存储 xff0c 可以被伪造和修改 容量和个数限制 xff1
  • R语言中的igraph包绘制网络图

    本文转自网络 R语言中的igraph包可以很方便地画出网络图 xff0c 在社交关系分析等领域发挥重要作用 xff0c 下面介绍包中一个重要的函数graph from data frame xff08 xff09 graph from da
  • OnNewIntent四种启动模式下的调用时机

    Activity启动模式 Intent Flags taskAffinity task和back stack总结 1 singleInstance模式 第一次进入 xff1a onCreate onStart 在栈顶再次进入 xff1a o
  • windows10 Ubuntu 双系统安装及美化详细步骤

    Windows 10 Ubuntu 双系统安装踩坑实录 写在前面背景介绍 硬件介绍安装 Ubuntu下载镜像文件 制作启动盘安装步骤 安装必备软件混凝土长方形实体逾越工具安装 Nvidia 显卡驱动远程连接工具即时通讯中文输入法 美化 Ub
  • 如何优雅地停止java程序

    方法一 span class token class name System span span class token punctuation span span class token function exit span span c
  • 删除数组里面的某一个值

    Array prototype remove span class token operator 61 span function span class token punctuation span val span class token
  • ASP.NET中实现点击不同菜单项,在当前页面显示其对应内容

    疑惑 xff1a 用ASP NET开发项目时 xff0c 若想要实现这样的界面 xff1a 顶部是导航栏 xff0c 有多个菜单项 xff0c 点击不同的菜单项后 xff0c 下方显示对应的内容页面 xff1b 或者是左侧是菜单栏 xff0
  • 解决error ‘XXX‘ is not defined no-undef且项目没有eslintrc.js文件问题

    问题描述 这是因为eslint的语法校验导致的问题 xff0c 文件是通过public的index html中 lt script src 61 34 xxxxxx js 34 gt lt script gt 引入的 xff0c 没有定义全
  • CentOS7 下MariaDB安装与简单配置(最新)

    前言 MySQL和MariaDB的区别 xff1a LAMP架构盛极一时 xff0c 这离不开MySQL的免费与易用 xff0c 但是在Oracle收购了Sun之后 xff0c 很多公司开始担忧MySQL的开源前景 xff0c 而最近Ora
  • JAVA基础知识(一)

    目录 1 java的数据类型类型之间的转换 xff08 自动转型 强制转型 特殊点 xff09 2 运算符2 1算术运算符2 2逻辑运算符2 3关系运算符2 4赋值运算符2 5三目运算符2 6位运算符 3 运算符的优先级4 表达式5 转义字
  • JAVA基础知识(二)

    目录 1 循环遍历2 排序算法2 1 冒泡排序2 2 选择排序2 3插入排序 3 数组的查找3 1顺序查找3 2二分查找 xff08 折半查找 xff09 4 Arrays工具类5 可变参数 1 循环遍历 JAVA中的常用的循环遍历有for
  • JAVA基础知识(三)

    目录 1 JAVA关键字1 1关键字 xff1a private1 2关键字 xff1a this1 3关键字 xff1a static1 4关键字 xff1a super1 5关键字 xff1a final 2 继承继承中的构造方法 3
  • JAVA基础知识(四)

    目录 1 抽象类 抽象方法2 接口interface3 多态4 对象转型5 内存分析6 设计原则7 单例设计模式 1 抽象类 抽象方法 1 抽象方法和抽象类必须使用abstract修饰符修饰 xff0c 有抽象方法的类只能被定义成抽象类 x
  • 基于mybatis-plus的代码自动生成工具(自定义模板)

    MyBatis Plus是一个MyBatis框架的增强工具 xff0c 在MyBatis的基础上只做增强不做改变 xff0c 为简化开发 提高效率而生 对于mybatis plus不了解的同学 xff0c 可以去MyBatis Plus官网
  • capabilities: ambient capabilities说明

    linux capability介绍 最早之前 xff0c linux对任务权限分为privileged processes xff08 UID等于0 xff0c 属于超级用户或者root用户 xff09 和unprivileged pro