SeeFlowerX / stackplz

基于eBPF的堆栈追踪工具
Apache License 2.0
911 stars 179 forks source link

报错 #46

Closed enenH closed 5 months ago

enenH commented 8 months ago

panic: unexpected EOF

goroutine 13 [running]: stackplz/user/argtype.parse_STRING_ARRAY({0x77a6caca68?, 0x20?}, 0x4000316d08?, 0x598df06478?, 0x0?) /home/runner/work/stackplz/stackplz/user/argtype/argtype_complex.go:91 +0x3a0 stackplz/user/argtype.(ARG_STRUCT).Parse(0x598e02a2e0?, 0x40000aab10?, 0x590000003a?, 0x70?) /home/runner/work/stackplz/stackplz/user/argtype/argtype_base.go:631 +0x70 stackplz/user/config.(PointArg).Parse(0x598e097940?, 0x4001cec9f0?, 0x598e09bb00?, 0x8e47c238?) /home/runner/work/stackplz/stackplz/user/config/config_point_arg.go:116 +0x88 stackplz/user/config.(SyscallPoint).ParseEnterPoint(0x40010136c0?, 0x598e005c00?) /home/runner/work/stackplz/stackplz/user/config/config_syscall.go:55 +0xd8 stackplz/user/event.(SyscallEvent).ParseContext(0x40010136c0) /home/runner/work/stackplz/stackplz/user/event/event_raw_syscalls.go:56 +0x260 stackplz/user/event.(SyscallEvent).ParseEvent(0x40010136c0) /home/runner/work/stackplz/stackplz/user/event/event_raw_syscalls.go:31 +0x4c stackplz/user/event_processor.(EventProcessor).dispatch(0x40002ee920, {0x598e09c130, 0x40010136c0}) /home/runner/work/stackplz/stackplz/user/event_processor/processer.go:55 +0x48 stackplz/user/event_processor.(EventProcessor).Serve(0x40002ee920) /home/runner/work/stackplz/stackplz/user/event_processor/processer.go:41 +0x44 stackplz/user/module.(Module).Run.func2() /home/runner/work/stackplz/stackplz/user/module/imodule.go:128 +0x28 created by stackplz/user/module.(*Module).Run /home/runner/work/stackplz/stackplz/user/module/imodule.go:127 +0xc0

SeeFlowerX commented 8 months ago

请提供测试命令,复现步骤,以及具体使用的版本。

如果不是最新版,请到releases下载最新版再次测试。

enenH commented 8 months ago

./stackplz -p 30538 -s all 我在监听一个sh,不知道他干了啥导致的崩溃 就是你最新发的release

SeeFlowerX commented 8 months ago

无法复现,如果内核版本大于5.10,请添加--btf选项测试

yxsra commented 8 months ago

无法复现,如果内核版本大于5.10,请添加--btf选项测试

这个就是错误处理 aarch32 syscall 导致的

SeeFlowerX commented 8 months ago

无法复现,如果内核版本大于5.10,请添加--btf选项测试

这个就是错误处理 aarch32 syscall 导致的

还是没有搞清楚,因为v3.0.3以及屏蔽调了aarch32 syscall,如果目标进程是32的,都不会有输出的。

如果他用的v3.0.2,我找了filebrowser,测试出来也没有出现直接panic的情况,你这有能复现崩溃的样本吗

filebrowser: ELF executable, 32-bit LSB arm, static

按照已有代码,即使数据或者参数读取出来是错误的,也不会产生崩溃,应该会处理显示为空

@enenH 如果方便的话,你可以将样本和复现步骤发到我邮箱。

yxsra commented 8 months ago

无法复现,如果内核版本大于5.10,请添加--btf选项测试

这个就是错误处理 aarch32 syscall 导致的

还是没有搞清楚,因为v3.0.3以及屏蔽调了aarch32 syscall,如果目标进程是32的,都不会有输出的。

如果他用的v3.0.2,我找了filebrowser,测试出来也没有出现直接panic的情况,你这有能复现崩溃的样本吗

filebrowser: ELF executable, 32-bit LSB arm, static

按照已有代码,即使数据或者参数读取出来是错误的,也不会产生崩溃,应该会处理显示为空

@enenH 如果方便的话,你可以将样本和复现步骤发到我邮箱。

用 v3.0.2 , stackplz --uid .... -s all ... ,指定一个 32 位 的 app ,大概率可以复现,它应该是解析某个 syscall 出问题了导致的。

SeeFlowerX commented 8 months ago

复现了,我研究一下这个是什么回事

SeeFlowerX commented 7 months ago

此问题已在 https://github.com/SeeFlowerX/stackplz/commit/16159c4b2824018c66577ce85554c43f46925178 修复

出现这个问题的原因是:当错误绑定调用号关系时,拿到的寄存器这些自然是些非法地址,然后把这些地址当作字符串数组处理时,没有正确处理字符串数组读取结束的界限。

另外从本issue发现了新的问题,那就是32位软件在64位系统中,调用的命令是64位的,即产生一个64位的进程。

如果是同时追踪两个架构的进程,没办法同时处理解析。。。

暂时不管这种情况了233