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

黑魔法--用 ebpf 构建用户空间数据的桥梁 - liyan

运行效果

在看运行效果之前,需要先看下目标示例的代码以便更好的理解本文介绍的功能:

// user/obj/obj.go
package mainimport ("fmt"
)var Len = 5// 预设的 uprobe
//go:noinline
func Set(info []byte) {fmt.Println("info: ", string(info))return
}// 预设的 uprobe
//go:noinline
func Get(info []byte) []byte {fmt.Printf("info addr: %p
", info)fmt.Println(string(info))         // 请注意这里的输出操作return info
}type Third struct {Info string
}func (t *Third) SetSomething(info string) {infoByt := []byte(info)// 这里假设是个约束infoByt = infoByt[:Len]Set(infoByt)  // 在这里调用预设的处理函数
}func (t *Third) GetSomething() string {infoByt := make([]byte, Len, Len)infoByt = Get(infoByt) // 在这里调用预设的处理函数return string(infoByt)
}func main() {third1 := Third{}info := "12345"third1.SetSomething(info)  // 请注意,这里进行写入的对象/* very long handle logic, many goroutines or proces happend here */third2 := Third{}// 请注意,这里读取的对象和上述执行写入的对象是完全没有关系的infoGet := third2.GetSomething()fmt.Printf("after getInfo, [%s]
", infoGet)
}

这段代码非常简单,下面进行了两次执行来说明ebpf达到的效果:

$ ./obj  // 第一次,没有使用 ebpf 生效。代码的正常输出结果
info:  12345
info addr: 0xc0000180f0// 请注意这里
after getInfo, []$ ./obj  // 第二次,开始执行前开启 ebpf 监听
info:  12345
info addr: 0xc0000180f0
12345                    // 请注意这里
after getInfo, [12345]

请关注上述示例里的注释。通过ebpfattach,实现了数据从用户空间->ebpf空间->用户空间,这个过程并不关心用户代码里发生了什么,ebpf只关注预设的uprobe是怎么被调用的。

应用及思考

ebpf的这个功能显然具有很广泛的应用,但是具体的应用就需要结合业务的应用来说明了(颇有一些拿着锤子找钉子的感觉),比如:结合调用了特定埋点sdk的使用,能够用来对traceId信息的补全。
事物自然都有两面性,ebpf提供了变更用户空间数据的潜力,自然就会带来风险:代码里的逻辑似乎不再靠谱了。而且,想象下将代码里的读操作,变更为删除操作,将会对用户空间的安全造成很大的破坏。

ebpf 逻辑

之前一直是使用bpftrace来进行示例演示的,但是本文涉及的功能需要使用long bpf_probe_write_user(void *dst, const void *src, u32 len)这个bpf-helper函数。笔者没有找到bpftrace里的调用方式,因此采用cilium-ebpf来进行示例演示。其中涉及的主要bpf代码附在下面,基本表述了相对原生的bpf-helper的调用方法。

struct{__uint(type, BPF_MAP_TYPE_HASH);__uint(key_size, sizeof(u32));__uint(value_size, sizeof(u8)*5);__uint(max_entries, 100);
} info_map SEC(".maps");struct event{u64 pid_tgid;u8 info[5];  // 这里的成员长度,请结合 obj.go 来看uintptr_t addr;long res;
};
typedef struct event event_t;
// Force emitting struct event into the ELF.
const struct event *unused __attribute__((unused));struct {__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
} events SEC(".maps");SEC("uprobe/main_set")
int uprobe__main_set(struct pt_regs *ctx){uintptr_t info_p = 0;u8 info[5];u64 pid_tgid = bpf_get_current_pid_tgid();SARG(ctx, 0, info_p);bpf_probe_read(&info, sizeof(info), (const void*)info_p);u32 tgid = (u32)(pid_tgid >> 32);bpf_map_update_elem(&info_map, &tgid, &info, BPF_ANY);event_t event = {};event.pid_tgid = pid_tgid;memcpy(event.info, info, sizeof(info));bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));return 0;
}SEC("uprobe/main_get")
int uprobe__main_get(struct pt_regs *ctx){uintptr_t info_p = 0;u64 pid_tgid = bpf_get_current_pid_tgid();void* r_info_p = NULL;u32 tgid = (u32)(pid_tgid >> 32);r_info_p = bpf_map_lookup_elem(&info_map, &tgid);if (r_info_p == NULL){return 0;}event_t event = {};event.pid_tgid = pid_tgid;SARG(ctx, 0, info_p);u8 info[5];memcpy(info, r_info_p, sizeof(info));memcpy(event.info, info, sizeof(event.info));event.res = bpf_probe_write_user((u8*)info_p, info, sizeof(info));event.addr = info_p;bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));return 0;
}

以上,周末愉快。

http://www.jsqmd.com/news/417236/

相关文章:

  • 一文读懂:CommonJS 和 ES Module 的本质区别
  • 2026最新新美业抗衰仪器/美业黑科技仪器/智提拉美容仪/AI智能抗衰仪器/抗衰美容仪器推荐:科技赋能抗衰,这家品牌实力出圈 - 十大品牌榜
  • 2026最新植牙五补牙五大医院排名及解析,服务深度覆盖银川、宁夏、贺兰县、兴庆区、金凤区等地 - 十大品牌榜
  • 2026年防晒霜品牌推荐:权威榜单解析与科学选购指南 - 十大品牌推荐
  • 2026年杭州背调公司终极评测(权威机构双重背书)| 企业选型避坑全指南 - 十大品牌推荐
  • 成都环保装修公司实测!4家主流品牌对比,附材料避坑指南 - 品牌测评鉴赏家
  • 成都老房翻新装修公司推荐|2026实测不踩坑,博主亲测整理 - 品牌测评鉴赏家
  • 导师又让重写?8个AI论文平台测评:专科生毕业论文写作全攻略
  • 智能问数Agent上限之争:数据集vs语义层,哪种设计路线更适合你的业务?
  • 2026成都装修公司口碑红黑榜|靠谱选择指南+实力品牌推荐,避坑就看这篇 - 品牌测评鉴赏家
  • MCP、Agent Skills与A2A的定位对比
  • 2026年杭州背调公司推荐:以i背调为代表的标杆企业深度解析 - 十大品牌推荐
  • # 震惊!GPT-5、Gemini Pro还在闭门造车?开源社区已实现惊天逆袭!10款重磅模型颠覆AI格局!
  • 揭秘永辉购物卡回收流程:如何选择平台避免踩坑? - 团团收购物卡回收
  • 2026年防晒霜品牌推荐:多场景深度评测与选购指南,解决防护力与妆效痛点 - 十大品牌推荐
  • AI大模型就业市场2026:AI岗位需求暴涨!年薪百万?大模型工程师成香饽饽,你跟上了吗?
  • 2026年仿竹护栏优质厂家推荐指南定制化设计出众 - 真知灼见33
  • 2026年不锈钢球厂家实力推荐榜:医用/食品级/耐磨/抗酸碱/磁性/醒酒用等全品类深度解析与选购指南 - 品牌企业推荐师(官方)
  • 从零到精通:7步解锁人工智能大模型开发全栈技能!
  • 成都装修探秘:解锁个性化定制的宝藏公司 - 品牌测评鉴赏家
  • NMN精准抗衰哪个牌子好?2026年十大NMN抗衰品牌排行榜,解锁逆龄密码 - 速递信息
  • 2026年杭州背调公司推荐榜单:技术赋能与合规安全双重视角下的行业审视 - 十大品牌推荐
  • 2026新房全案装修哪家好?实测口碑榜+避坑指南,小白直接抄作业 - 品牌测评鉴赏家
  • FER-8;H2N-FEFEFRFK-OH
  • PyTorch机器学习与深度学习:数据清洗、经典机器学习、卷积神经网络、迁移学习、YOLO目标检测与LSTM时间序列预测等掌握AI核心算法!
  • 细聊神八五苔的抛圆硫酸钾靠谱吗,南京市场性价比高吗 - myqiye
  • 云安全服务-分类
  • 东莞卓世橡胶制品专业度如何,推荐选择吗? - mypinpai
  • 亲测好用 9个AI论文工具测评:本科生毕业论文写作必备神器
  • 卡西欧手表批发性价比怎样,靠谱的卡西欧手表批发品牌有哪些? - 工业品牌热点