趋势科技 redirfs模块的一个小问题
最近看的一个问题,消息队列可以创建,但是不能获取属性,也不能发消息,返回错误为:EBADF Bad file descriptor
经过打点,确认走入了这个流程:
SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
const struct mq_attr __user *, u_mqstat,
struct mq_attr __user *, u_omqstat)
{
int ret;
struct mq_attr mqstat, omqstat;
struct fd f;
struct inode *inode;
struct mqueue_inode_info *info; if (u_mqstat != NULL) {
if (copy_from_user(&mqstat, u_mqstat, sizeof(struct mq_attr)))
return -EFAULT;
if (mqstat.mq_flags & (~O_NONBLOCK))
return -EINVAL;
} f = fdget(mqdes);
if (!f.file) {
ret = -EBADF;
goto out;
} inode = file_inode(f.file);
if (unlikely(f.file->f_op != &mqueue_file_operations)) {--------走的这个分支,导致错误
ret = -EBADF;
goto out_fput;
}
这个分支判断按道理也没什么问题,因为既然是消息队列,那么file->f_op就应该是 mqueue_file_operations 。
static int do_dentry_open(struct file *f,
int (*open)(struct inode *, struct file *),
const struct cred *cred)
{
。。。。。 f->f_op = fops_get(inode->i_fop);
}
根据alloc_inode的流程:
static struct inode *alloc_inode(struct super_block *sb)
{
。。。。 if (unlikely(inode_init_always(sb, inode))) {
。。。。
} int inode_init_always(struct super_block *sb, struct inode *inode)
{
...
inode->i_op = &empty_iops;----------初始化默认值
inode->i_fop = &no_open_fops;-------初始化的默认值
...
}
正常情况下在mq_open-->mqueue_create-->mqueue_get_inode 中会将
inode->i_fop = &mqueue_file_operations;
这样在 do_dentry_open 的时候,会将对应的 f->f_op = fops_get(inode->i_fop);
也就是正常的file.f_op为:
struct file.f_op ffff883f53079500
f_op = 0xffffffff81690fa0 <mqueue_file_operations>
mqueue_file_operations = $1 = {
owner = 0x0,
llseek = 0xffffffff811e00d0 <default_llseek>,
read = 0xffffffff81278220 <mqueue_read_file>,
write = 0x0,
aio_read = 0x0,
aio_write = 0x0,
readdir = 0x0,
poll = 0xffffffff812781a0 <mqueue_poll_file>,
unlocked_ioctl = 0x0,
compat_ioctl = 0x0,
mmap = 0x0,
open = 0x0,
flush = 0xffffffff812790f0 <mqueue_flush_file>,
release = 0x0,
fsync = 0x0,
aio_fsync = 0x0,
fasync = 0x0,
lock = 0x0,
sendpage = 0x0,
get_unmapped_area = 0x0,
check_flags = 0x0,
flock = 0x0,
splice_write = 0x0,
splice_read = 0x0,
{
setlease = 0x0,
__UNIQUE_ID_rh_kabi_hide5 = {
setlease = 0x0
},
{<No data fields>}
},
fallocate = 0x0,
show_fdinfo = 0x0
}
而异常情况下的file.f_op为:
struct file.f_op 0xffff883e8d075b00
f_op = 0xffff883ba95251b8
struct file_operations {
owner = 0x0,
llseek = 0xffffffff811e00d0 <default_llseek>,
read = 0xffffffff81278220 <mqueue_read_file>,
write = 0xffffffffa04e97f0 <rfs_write>,--------------redirfs模块修改的
aio_read = 0x0,
aio_write = 0x0,
readdir = 0x0,
poll = 0xffffffff812781a0 <mqueue_poll_file>,
unlocked_ioctl = 0x0,
compat_ioctl = 0x0,
mmap = 0xffffffffa04e9380 <rfs_mmap>,---------------redirfs模块修改的
open = 0xffffffffa04ea3a0 <rfs_open>,---------------redirfs模块修改的
flush = 0xffffffff812790f0 <mqueue_flush_file>,
release = 0xffffffffa04e9d50 <rfs_release>,---------redirfs模块修改的
fsync = 0x0,
aio_fsync = 0x0,
fasync = 0x0,
lock = 0x0,
sendpage = 0x0,
get_unmapped_area = 0x0,
check_flags = 0x0,
flock = 0x0,
splice_write = 0x0,
splice_read = 0x0,
{
setlease = 0x0,
__UNIQUE_ID_rh_kabi_hide5 = {
setlease = 0x0
},
{<No data fields>}
},
fallocate = 0x0,
show_fdinfo = 0x0
}
而修改这个的模块为redirfs,是趋势科技的一个内核模块,看起来是用来给他们的filter服务的,普通的文件打开时,只是检查file.f_op不为NULL,但是msgqueue则多了一项检查,导致检查不通过。
lsmod |grep -i redirfs
redirfs 79430 1 gsch lsmod |grep -i gsch
gsch 93171 8
redirfs 79430 1 gsch locate redirfs
/opt/ds_agent/3.10.0-229.11.1.el7.x86_64/redirfs.ko
虽然这个问题,趋势可以使用最暴力的直接修改sys_call_table 的方式来规避这个问题:
0xffffffffa0514cf0 <gsch_write_hook_fn>
0xffffffffa0516a80 <gsch_open_hook_fn>
0xffffffffa05158a0 <gsch_close_hook_fn>
0xffffffffa0514dd0 <gsch_pwrite64_hook_fn>
0xffffffffa0514ec0 <gsch_writev_hook_fn>
0xffffffffa0515a80 <gsch_dup2_hook_fn>
0xffffffffa05149a0 <gsch_exit_hook_fn>
0xffffffffa0514fa0 <gsch_unlink_hook_fn>
0xffffffffa0514940 <gsch_getpgid_hook_fn>
0xffffffffa0514a20 <gsch_exit_group_hook_fn>
但是这样明显侵入性太强了,毕竟这年头通过修改sys_call来完成功能的内核模块太多了,这样的话存在加载顺序的bug之类的。
那假设是我们使用redirfs来完成filter这种辅助功能,应该怎么修改呢?把判断去掉么,因为判断 mqueue_file_operations 这个指针的地方还蛮多的
几乎所有的mq开头的系统调用都需要篡改,似乎也没有好的办法,回到问题的原点,趋势干嘛不对msgqueue这种文件类型过滤掉呢?
趋势科技 redirfs模块的一个小问题的更多相关文章
- windows平台python svn模块的一个小 bug
环境 编程语言版本:python 2.7 操作系统:win10 64位 模块名:svn svn checkout时报错 File "D:\Python27\lib\site-package ...
- 关于ASPOSE.WORD使用上的一个小问题
最近实习期间负责了公司某个项目的一个功能模块里面的word导出功能,使用的是ASPOSE.WORD类库,但是经常导出时候会遇到图中的问题,大概意思就是两个表格不能跨在一起,调试了好几次还是没发现具体的 ...
- 关于sniff函数的一个小坑
最近在用scapy模块写一个关于WiFi的脚本时用到sniff函数,其中遇到了一个小坑,记录如下: sniff函数是在指定网卡上每次嗅探到一个数据包后然后将它传给prn指定的函数.
- 一个小框架,基于rx_retrofit2_mvp
离职在即,也没什么事情做,就鼓捣了一下.任意搭建了一个小框架,看看以后能不能搞出自己的一个model,好了.不说别的,上代码 1,先上依赖库 compile 'io.reactivex:rxandro ...
- Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)
大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...
- python笔记_查看函数调用栈的一个小技巧
一.背景 最近在看一个开源框架的源码,涉及到的内容非常杂乱,有的函数不知道是在什么时候被谁给调用了?调用的时候传入了什么参数?为了解决这个问题,写了一个小的装饰器. 二.实现 这个装饰器函数主要参考了 ...
- Python:通过一个小案例深入理解IO多路复用
通过一个小案例深入理解IO多路复用 假如我们现在有这样一个普通的需求,写一个简单的爬虫来爬取校花网的主页 import requests import time start = time.time() ...
- python中os模块的一些小总结
(一)os模块的应用小总结 os.name: 获取当前系统平台,Windows下返回'nt',Linux下返回'posix'. os.linesep: 获取当前平台使用的行终止符.Windows下 ...
- Hutool :一个小而全的 Java 工具类库
Hutool 简介 Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的 ...
随机推荐
- frp 用于内网穿透的基本配置和使用
frp 用于内网穿透的基本配置和使用 今天是端午节,先祝端午安康! frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便 ...
- java提前工作、第一个程序
java提前工作 我们学习编程肯定会 运用到相应的软件 在这里 我个人推荐 eclipse.idea 这里的软件呢 都是用我们的java编程出来的,那它也需要用java来支持他的开发环境 这里就运用到 ...
- 基恩士的浓淡补正算法(Shading Correction Filter)的模拟实现。
知道这个算法应该有很久了,主要当时在意2个事情,一个是这个名字的翻译是在是搞笑,第二是这个算法的效果.不过一直以来都十分好奇这个算法是怎么实现的.因为之前一直无法实际的用基恩士的软件平台用不同的图片去 ...
- VisionPro · C# · 实时取像
VisionPro 在C#项目程序中实现实时取像方式,有两种: 1.采用界面控件 CogAcqFifoTool 进行操作,与在VisionPro软件中操作一致: 2.采用界面控件 CogRecord ...
- sql-关键词的大小写与注释
是否区分大小写 和 注释 大小写 oracle 自带的sqlplus: mysql 客户端 : Navicat: 注释 oracle 自带的sqlplus: mysql 客户端 : 小节 oracle ...
- 【机器学习】K-means聚类分析
前言 聚类问题是无监督学习的问题,算法思想就是物以类聚,人以群分,聚类算法感知样本间的相似度,进行类别归纳,对新输入进行输出预测,输出变量取有限个离散值.本次我们使用两种方法对鸢尾花数据进行聚类. 无 ...
- mt19937 用法
老是忘记怎么用,自己写一个用作备忘录吧. 首先需要的头文件: #include <random> 或者是 #include <bits/stdc++.h> //万能头 yyds ...
- 小米社区APP深度体验
小米社区APP深度体验 版本:3.0.210928 BUG 1,在暗黑模式下,会员一栏中的成就等级小字未作深色模式调整,从而造成文字难于识别. 2,在暗黑模式下,会员页中底部的会员产品首页视觉没有完美 ...
- input 回车输入+选择标签
来源 博客园收藏博客 页面展示 模板代码 需求 点击按钮可在已建标签列表中选择标签: 对于没有的标签:在输入框中输入后,回车键新建标签 补充 以前做过类似这样的组件:select 下拉列表 + 回车新 ...
- 以寡治众各个击破,超大文件分片上传之构建基于Vue.js3.0+Ant-desgin+Tornado6纯异步IO高效写入服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_218 分治算法是一种很古老但很务实的方法.本意即使将一个较大的整体打碎分成小的局部,这样每个小的局部都不足以对抗大的整体.战国时期 ...