当前位置: 首页 > news >正文

Linux 安全 - LSM hook点

文章目录

  • 一、LSM file system hooks
    • 1.1 LSM super_block hooks
    • 1.2 LSM file hooks
    • 1.3 LSM inode hooks
  • 二、LSM Task hooks
  • 三、LSM IPC hooks
  • 四、LSM Network hooks
  • 五、LSM Module & System hooks

一、LSM file system hooks

在VFS(虚拟文件系统)层中,定义了三个主要对象,它们封装了低级文件系统开发所使用的接口:

super_block(超级块)对象
file(文件)对象
inode(索引节点)对象

每个对象都包含一组操作,这些操作定义了VFS与实际文件系统之间的接口。LSM(Linux安全模块)利用这些接口来介入文件系统访问。

LSM使用内核对象中定义的不透明安全指针:

super_block(超级块)结构体
file(文件)结构体
inode(索引节点)结构体

通过在这些结构体中添加安全指针,LSM可以监视和控制与文件系统相关的操作。这样,LSM可以在文件系统访问过程中介入,执行安全策略检查、权限控制等操作,以增强系统的安全性。

1.1 LSM super_block hooks

struct super_block {......
#ifdef CONFIG_SECURITYvoid                    *s_security;
#endif.....
}

当文件系统在内核中表示时,super_block 结构体是代表该文件系统的内核对象。

super_block 结构体在挂载和卸载文件系统以及获取文件系统统计信息时被使用。

LSM(Linux安全模块)提供了一组钩子函数,用于介入对 super_block 的各种操作。

在挂载文件系统时,内核首先通过调用 sb_mount() 钩子函数来验证挂载请求的有效性。LSM可以使用该钩子函数执行额外的安全检查,例如验证挂载任务的权限或确保挂载选项的有效性。

在卸载文件系统时,会调用 sb_umount() 钩子函数来检查卸载文件系统所需的权限。LSM可以利用这个钩子函数来执行访问控制,确保只有授权的任务能够执行卸载操作。

sb_remount() 钩子函数在修改文件系统挂载选项时被调用。LSM可以利用该钩子函数验证请求的挂载选项的有效性和安全性。

当任务尝试获取文件系统统计信息(如磁盘使用情况或可用空间)时,会调用 sb_statfs() 钩子函数。LSM可以使用该钩子函数执行权限检查,确保只有授权的任务能够访问文件系统统计信息。

union security_list_options {......int (*sb_remount)(struct super_block *sb, void *mnt_opts);int (*sb_statfs)(struct dentry *dentry);int (*sb_mount)(const char *dev_name, const struct path *path,const char *type, unsigned long flags, void *data);int (*sb_umount)(struct vfsmount *mnt, int flags);......
}

通过介入对 super_block 结构体及其相关操作的访问,LSM在强制安全措施、验证权限和控制文件系统操作方面发挥着重要作用。它可以执行安全策略检查、增强访问控制,并确保文件系统的完整性和安全性。

1.2 LSM file hooks

当文件在内核中表示为打开文件时,file 结构体是代表该文件的内核对象。

file 结构体包含了关于文件的信息,如文件位置、访问模式和与文件相关的数据。

在 file 结构体中,有一个 file_operation 结构体,描述了可以对文件执行的操作。这些操作包括从文件中读取数据、向文件写入数据、寻址文件、将文件映射到内存等等。

LSM(Linux安全模块)提供了一组文件钩子函数,用于介入对文件的访问。

file_permission() 钩子函数用于在每次文件读取和写入操作时重新验证读写权限。LSM可以利用该钩子函数执行额外的权限检查,确保尝试读取或写入文件的任务具有必要的权限。

file_locks() 钩子函数用于在使用锁来同步多个读取器或写入器访问文件时。任务在执行任何文件锁定操作之前必须通过 file_locks() 钩子函数的权限检查。该钩子函数使LSM能够执行访问控制,防止未经授权的锁定操作。

file_ioctl() 和 file_fcntl() 钩子函数用于处理通过 ioctl(2) 和 fcntl(2) 系统调用发起的各种杂项文件操作。这些钩子函数使LSM能够介入和控制各种文件相关操作,例如设置文件属性、控制文件行为或执行特定于某些文件类型的特殊操作。

通过介入对 file 结构体及其相关操作的访问,LSM在强制安全措施、验证权限和控制文件访问方面发挥着重要作用。它能够执行安全策略检查,增强访问控制,并确保系统内文件操作的完整性和安全性。

1.3 LSM inode hooks

inode 结构体是表示内核文件对象(如文件、目录或符号链接)的内核对象。

当文件系统中的文件、目录或符号链接在内核中被表示时,inode 结构体就扮演着代表其元数据的角色。

LSM(Linux安全模块)提供了一组钩子函数,用于介入对 inode 结构体的访问。

内核的 inode 缓存通过文件查找操作(例如打开文件)或文件系统对象创建操作(例如创建新文件或目录)填充。

LSM可以利用这些钩子函数来介入对 inode 结构体的访问,并对其上执行的操作进行调控。这些钩子函数允许LSM执行安全策略检查、权限控制以及对文件系统对象的访问控制。

LSM提供的与 inode 操作相关的钩子函数包括:
(1)文件的创建和删除:在创建或删除文件、目录或其他文件系统对象时调用的钩子函数,例如 create()、mkdir()、rmdir()、mknod() 和 rename()。

(2)链接和解除链接:用于创建或删除硬链接或符号链接时调用的钩子函数,例如 link()、unlink()、symlink()、readlink() 和 follow_link()。

(3)属性操作:用于获取或修改文件属性、扩展属性和权限的钩子函数,例如 getattr()、setattr()、getxattr()、setxattr() 和 permissions()。

在这些钩子函数中,LSM可以执行各种与安全相关的任务,例如验证权限、强制访问控制策略、审计文件操作,并根据文件的属性和请求的操作应用其他安全检查。

通过介入对 inode 结构体及其关联操作的访问,LSM在增强文件系统的安全性方面发挥着关键作用。它通过实施细粒度的访问控制和确保符合安全策略来提高文件系统的安全性。

二、LSM Task hooks

当任务在内核中表示为可调度任务时,task_struct 结构体是代表该任务的内核对象。

task_struct 结构体包含了任务的基本信息,如用户/组 ID、资源限制以及调度策略和优先级等。

LSM(Linux安全模块)提供了一组任务钩子函数,用于介入任务对基本任务信息的访问。

task_alloc() 钩子函数用于验证任务是否可以创建子任务。当任务尝试创建子任务时,LSM可以利用该钩子函数执行额外的检查,例如验证任务的权限或强制执行与任务创建相关的特定策略。

task_kill() 钩子函数在任务退出或被终止时被调用。LSM可以使用该钩子函数执行清理操作、释放任何已持有的资源或记录相关信息,然后再终止任务。

在任务的生命周期中,一些信息可能会发生变化。例如,当任务调用 setuid(2) 等系统调用来更改其用户 ID 时,会触发 task_fix_setuid() 钩子函数。LSM可以拦截这类调用,并执行额外的操作或检查,以确保任务状态的安全性和完整性。

通过使用这些任务钩子函数,LSM可以对任务对基本任务信息的访问进行控制。它能够执行安全策略检查、验证权限,并控制任务相关操作。

通过任务钩子函数,LSM增强了系统的安全性和稳定性。它能够强制访问控制,验证权限,并执行必要的操作,以保持任务相关操作的完整性。

三、LSM IPC hooks

当任务需要访问内核中的 SysV IPC 机制时,内核提供了标准的 SysV IPC 机制,包括共享内存、信号量和消息队列等。这些机制允许进程之间进行通信和共享数据。

LSM(Linux安全模块)为这些 IPC 机制提供了一组钩子函数,用于介入对内核 IPC 对象的访问。这些钩子函数使得 LSM 能够执行安全策略检查、验证权限,并控制与 IPC 对象相关的操作。

ipc_permission() 钩子函数用于检查 IPC 对象的权限。当进程尝试访问 IPC 对象(如共享内存、信号量或消息队列)时,LSM 可以使用该钩子函数验证进程是否具有执行所请求操作的必要权限。

msg_queue_msgrcv() 钩子函数在消息从消息队列中被移除之前进行调用。LSM 可以使用该钩子函数检查权限,确保只有授权的进程才能读取或删除消息队列中的消息。

shm_shmat() 钩子函数在执行 shmat(2) 系统调用之前进行调用,该调用将共享内存段附加到调用进程的数据段。LSM 可以利用该钩子函数检查权限,只允许具有适当权限的进程访问共享内存。

sem_semctl() 钩子函数在对信号量执行指定命令的操作之前进行调用。LSM 可以使用该钩子函数检查权限,并确保只有具有必要权限的进程才能对信号量执行指定的操作。

通过这些 IPC 钩子函数,LSM 增强了对内核 IPC 对象的访问控制和安全性。它可以执行安全策略检查,验证权限,并控制与共享内存、信号量和消息队列相关的操作。

通过 IPC 钩子函数,LSM 可以进行安全性检查、权限验证,并确保系统内 IPC 操作的完整性和安全性。这有助于防止未经授权的访问,强制执行访问控制,并维护系统的安全性和稳定性。

四、LSM Network hooks

网络是Linux中的一个重要方面,尤其是在保护系统免受网络攻击方面,LSM为内核的这个领域提供了扩展的安全性。应用层对网络的访问是通过一系列与套接字相关的钩子函数进行介入的。

针对所有套接字系统调用提供了钩子函数:

bind()connect()listen()accept()sendmsg()recvmsg()getsockname()getpeername()getsockopt()等等。

网络数据通过sk_buff结构在网络栈中传输,LSM为sk_buff提供了不透明的安全字段,以便可以在每个数据包的基础上跨网络层管理安全状态。

LSM通过提供针对网络相关操作的钩子函数,为内核中的网络部分提供了扩展的安全性。通过这些钩子函数,LSM可以介入应用程序层对网络的访问,验证权限,执行安全策略,并控制与套接字相关的系统调用。

钩子函数包括bind()、connect()、listen()、accept()、sendmsg()、recvmsg()、getsockname()、getpeername()、getsockopt()等套接字系统调用。通过这些钩子函数,LSM可以对套接字操作进行安全策略检查、权限验证和控制。

此外,LSM还为不同的网络协议(如IPv4、Unix域、Netlink、InfiniBand和SCTP)实现了更细粒度的钩子函数。这样可以根据不同协议的特性和需求,对网络操作进行更精细的控制和安全策略管理。

在网络数据传输过程中,数据以sk_buff结构的形式在网络栈中进行封装和传递。LSM为sk_buff提供了不透明的安全字段,以便可以在每个数据包的基础上管理安全状态。这样可以确保安全状态在网络层的各个环节中得到维护和传递,从而增强系统对网络攻击的防护能力。

五、LSM Module & System hooks

LSM提供了一个模块化框架,用于增强Linux内核的安全性。它允许集成多个安全模块,每个模块都实现自己的安全策略和机制。

LSM的一个关键方面是能够介入内核模块的加载和卸载过程。这确保只有经过授权和可信任的模块可以加载到内核中,防止未经授权的代码执行和潜在的安全漏洞。

LSM为处理密钥管理操作定义了专门的钩子。这些钩子使LSM模块能够在涉及基于密钥的操作时执行安全策略和权限检查,例如加密、解密和身份验证。

除了密钥管理,LSM还为其他各种关键操作定义了钩子。这包括检查更改系统时间的权限、分配新的虚拟内存映射的权限、访问内核消息环的权限等。通过在这些关键点执行安全检查,LSM有助于防止未经授权或恶意操作,以保护系统的完整性。

LSM与Linux审计框架集成,通过提供钩子函数,允许安全模块参与审计过程。这使得安全相关事件的记录和监控成为可能,有助于系统分析和取证调查。

LSM还扩展了对使用扩展伯克利数据包过滤器(eBPF)及其相关程序的支持。LSM定义了钩子,允许安全模块对使用eBPF程序的策略和限制进行执行,确保eBPF代码的安全和受控执行。

此外,LSM还包括了一组杂项钩子,用于保护上述特定钩子未涵盖的其他安全敏感操作。这些钩子为各种系统活动提供了额外的保护层,确保全面的安全覆盖。

LSM的灵活性和模块化使其成为增强Linux内核安全性的强大框架。通过支持模块加载、密钥管理、关键操作、审计、eBPF集成等功能,LSM能够执行细粒度的安全策略,并帮助保护系统免受各种威胁和攻击。

相关文章:

Linux 安全 - LSM hook点

文章目录 一、LSM file system hooks1.1 LSM super_block hooks1.2 LSM file hooks1.3 LSM inode hooks 二、LSM Task hooks三、LSM IPC hooks四、LSM Network hooks五、LSM Module & System hooks 一、LSM file system hooks 在VFS(虚拟文件系统)层…...

【iOS逆向与安全】越狱检测与过检测附ida伪代码

首先在网上查找一些检测代码 放入项目运行&#xff0c;用 ida 打开后 F5 得到下面的 __int64 __usercall sub_10001B3F0<X0>(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, __int64 a7, __int64 a8, __int64 a9, __int64 a10, __int64 a11…...

Android Studio gradle手动下载配置

项目同步时&#xff0c;有时候会遇到Android Studio第一步下载gradle就是连接失败的问题。 这种情况&#xff0c;我们可以手动去gradle官网下载好gradle文件&#xff0c;放置在Android Studio的缓存目录下&#xff0c;这样AS在同步代码时就会自动解压下载好的文件。 步骤如下&…...

ChatGPT Prompting开发实战(十三)

一&#xff0e; 如何评估prompts是否包含有害内容 用户在与ChatGPT交互时提供的prompts可能会包括有害内容&#xff0c;这时可以通过调用OpenAI提供的API来进行判断&#xff0c;接下来给出示例&#xff0c;通过调用模型“gpt-3.5-turbo”来演示这个过程。 prompt示例如下&…...

银河麒麟 ARM 架构 离线安装Docker

1. 下载对应的安装包 进入此地址下载对应的docker 离线安装包 下载地址 将文件上传到服务器 解压此文件 tar zxf docker-18.09.1.tgz将 docker 相关命令拷贝到 /usr/bin&#xff0c;方便直接运行命令 cp docker/* /usr/bin/启动Docker守护程序 dockerd &验证是否安装成…...

虹科科技 | 探索CAN通信世界:PCAN-Explorer 6软件的功能与应用

CAN&#xff08;Controller Area Network&#xff09;总线是一种广泛应用于汽车和工业领域的通信协议&#xff0c;用于实时数据传输和设备之间的通信。而虹科的PCAN-Explorer 6软件是一款功能强大的CAN总线分析工具&#xff0c;为开发人员提供了丰富的功能和灵活性。本文将重点…...

SELECT COUNT(*)会不会导致全表扫描引起慢查询

SELECT COUNT(*)会不会导致全表扫描引起慢查询呢&#xff1f; SELECT COUNT(*) FROM SomeTable 网上有一种说法&#xff0c;针对无 where_clause 的 COUNT(*)&#xff0c;MySQL 是有优化的&#xff0c;优化器会选择成本最小的辅助索引查询计数&#xff0c;其实反而性能最高&…...

英国物联网初创公司【FourJaw】完成180万英镑融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于英国谢菲尔德的物联网初创公司【FourJaw】今日宣布已完成180万英镑融资。 本轮融资完成后&#xff0c;FourJaw的总融资金额已达400万英镑&#xff0c;本轮融资的投资机构包括&#xff1a;…...

许战海战略文库|无增长则衰亡:中小型制造企业增长困境

竞争环境不是匀速变化&#xff0c;而是加速变化。企业的衰退与进化、兴衰更迭在不断发生&#xff0c;这成为一种不可避免的现实。事实上&#xff0c;在产业链竞争中增长困境不分企业大小&#xff0c;而是一种普遍存在的问题&#xff0c;许多收入在1亿至10亿美元间的制造企业也同…...

广州华锐互动:候车室智能数字孪生系统实现交通信息可视化

随着科技的不断发展&#xff0c;数字化技术在各个领域得到了广泛的应用。智慧车站作为一种新型的交通服务模式&#xff0c;通过运用先进的数字化技术&#xff0c;为乘客提供了更加便捷、舒适的出行体验。 将智慧车站与数字孪生大屏结合&#xff0c;可以将实际现实世界的实体车站…...

智慧工地:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地管理系统融合计算机技术、物联网、视频处理、大数据、云计算等&#xff0c;为工程项目管理提供先进的技术手段&#xff0c;构建施工现场智能监控系统&#xff0c;有效弥补传统监理中的缺陷&#xff0c;对人、机、料、法、环境的管理由原来的被动监督变成全方位的主动管…...

增强基于Cortex-M3的MCU以处理480 Mbps高速USB

通用串行总线&#xff08;USB&#xff09;完全取代了PC上的UART&#xff0c;PS2和IEEE-1284并行接口&#xff0c;现在已在嵌入式开发应用程序中得到广泛认可。嵌入式开发系统使用的大多数I / O设备&#xff08;键盘&#xff0c;扫描仪&#xff0c;鼠标&#xff09;都是基于USB的…...

山海鲸汽车需求调研系统:智慧决策的关键一步

随着社会的发展和科技的进步&#xff0c;汽车行业也迎来了新的挑战和机遇。如何更好地满足用户需求、提高产品竞争力成为了汽车制造商们关注的焦点。在这个背景下&#xff0c;山海鲸汽车需求调研互动系统应运而生&#xff0c;为汽车行业赋予了智慧决策的力量。 智慧决策的核心&…...

视频缩放的概念整理-步长数组

最近在读ffmpeg的代码时候&#xff0c;这个接口不是很能看懂int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[]); 多方请教后&#xff0c;记录结果如…...

TensorFlow入门(二十一、softmax算法与损失函数)

在实际使用softmax计算loss时,有一些关键地方与具体用法需要注意: 交叉熵是十分常用的,且在TensorFlow中被封装成了多个版本。多版本中,有的公式里直接带了交叉熵,有的需要自己单独手写公式求出。如果区分不清楚,在构建模型时,一旦出现问题将很难分析是模型的问题还是交叉熵的使…...

UDP通信:快速入门

UDP协议通信模型演示 UDP API DatagramPacket&#xff1a;数据包对象&#xff08;韭菜盘子&#xff09; public DatagramPacket(byte[] buf, int length, InetAddress address, int port)创建发送端数据包对象 buf&#xff1a;要发送的内容&#xff0c;字节数组 length&…...

修炼k8s+flink+hdfs+dlink(四:k8s(一)概念)

一&#xff1a;概念 1. 概述 1.1 kubernetes对象. k8s对象包含俩个嵌套对象字段。 spec&#xff08;规约&#xff09;&#xff1a;期望状态 status&#xff08;状态&#xff09;&#xff1a;当前状态 当创建对象的时候&#xff0c;会按照spec的状态进行创建&#xff0c;如果…...

redis与 缓存击穿、缓存穿透、缓存雪崩

什么是缓存击穿、缓存穿透、缓存雪崩 缓存击穿、缓存穿透和缓存雪崩是与缓存相关的三种常见问题&#xff0c;它们可以在高并发的应用中导致性能问题。以下是它们的解释&#xff1a; 缓存击穿&#xff08;Cache Miss&#xff09; 缓存击穿指的是在高并发情况下&#xff0c;有大…...

印度网络安全:威胁与应对

随着今年过半&#xff0c;我们需要评估并了解不断崛起的网络威胁复杂性&#xff0c;这些威胁正在改变我们的数字景观。 从破坏性的网络钓鱼攻击到利用人工智能的威胁&#xff0c;印度的网络犯罪正在升级。然而&#xff0c;在高调的数据泄露事件风暴中&#xff0c;我们看到了政…...

AR动态贴纸SDK,让创作更加生动有趣

在当今的社交媒体时代&#xff0c;视频已经成为了人们表达自我、分享生活的重要方式。然而&#xff0c;如何让你的视频在众多的信息中脱颖而出&#xff0c;吸引更多的关注和点赞呢&#xff1f;答案可能就在你的手中——美摄AR动态贴纸SDK。 美摄AR动态贴纸SDK是一款专为视频编辑…...

MySQL常用命令01

今天开始&#xff0c;每天总结一点MySQL相关的命令&#xff0c;方便大家后期熟悉。 1.命令行登录数据库 mysql -H IP地址 -P 端口号 -u 用户名 -p 密码 数据库名称 -h 主机IP地址 登录本机 localhost或127.0.0.1 -P 数据库端口号 Mysql默认是3306 -u 用户名 -p 密码 …...

Java synchronized 关键字

synchronized 是什么&#xff1f; synchronized 是 Java 中的一个关键字&#xff0c;翻译成中文就是 同步 的意思&#xff0c;主要解决的是多个线程之间访问资源的同步性&#xff0c;可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 如何使用 synchronized?…...

滑动窗口算法(C语言描述)

第一种类型&#xff1a;不固定长窗口 问题1&#xff1a;*** C代码1&#xff1a; #include<stdio.h> #include<string.h> #define N 5int min_len(int len1,int len2) {return (len1 < len2 ? len1:len2); }int main() {int target 0;int num[N];scanf("…...

【已修复】vcruntime140.dll有什么用,vcruntime140.dll缺失如何修复

我是网友&#xff0c;今天非常荣幸能够在这里和大家分享关于电脑找不到vcruntime140.dll无法继续执行代码的解决方法。我相信&#xff0c;在座的许多朋友都曾遇到过这个问题&#xff0c;而今天我将为大家介绍五种有效的解决方法。 首先&#xff0c;让我们来了解一下vcruntime1…...

10月12日,每日信息差

今天是2023年10月12日&#xff0c;以下是为您准备的13条信息差 第一、欧盟投资4.5亿欧元在法国建设电池超级工厂。欧洲投资银行是欧盟的贷款机构&#xff0c;也是世界上最大的跨国银行之一 第二、北京银行推出数字人民币智能合约平台 数字人民币预付资金管理产品在商超场景首…...

网络安全技术(黑客学习)——自学方法

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…...

引领创新浪潮:“Polygon探寻新技术、新治理、新代币的未来之路!“

熊市是用来建设的&#xff0c;Polygon Labs一直在利用这漫长的几个月来做到这一点。 Polygon 是最常用的区块链之一&#xff0c;每周约有 150 万用户&#xff0c;每天超过 230 万笔交易&#xff0c;以及数千个 DApp&#xff0c;Polygon 最近面临着日益激烈的竞争。虽然从交易数…...

Android 13.0 添加自定义服务,并生成jar给第三方app调用

1.概述 在13.0系统产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能 2. …...

PG14归档失败解决办法archiver failed on wal_lsn

问题描述 昨晚RepmgrPG14主备主库因wal日志撑爆磁盘&#xff0c;删除主库过期wal文件重做备库后上午进行主备状态巡查&#xff0c;主库向备库发送wal文件正常&#xff0c;但是查主库状态时发现显示有1条归档失败的记录。 postgres: archiver failed on 000000010000006F000000…...

YB4014是可以对单节磷酸铁锂电池进行恒流/恒压充电管理的集成电路。

概述&#xff1a; YB4014是可以对单节磷酸铁锂电池进行恒流/恒 压充电管理的集成电路。该器件内部包括功率晶 体管&#xff0c;不需要外部的电流检测电阻和阻流二极管 YB4014只需要极少的外围元器件&#xff0c;非常适合于 便携式应用的领域。热调制电路可以在器件的功 耗比较大…...