- Tác giả đang xử lý một vấn đề gỡ lỗi trong một dự án bao gồm
gdbserver và ứng dụng đa luồng chạy trên kiến trúc PowerPC32.
- Vấn đề là kết nối tới
gdbserver bị ngắt, khiến họ không còn có thể điều khiển phiên debug nữa.
- Sau khi nghiên cứu và điều tra, tác giả tìm thấy một chuỗi email chỉ ra chính xác commit đã gây ra vấn đề này.
- Tác giả đã dành 3-4 ngày để đọc mô tả commit liên quan đến kiến trúc PowerPC và những thay đổi xung quanh
task_struct, đồng thời cố gắng xác định liệu vấn đề này đã được khắc phục ở các phiên bản kernel sau đó hay chưa.
- Tác giả đã sử dụng nhiều công cụ và kỹ thuật khác nhau, như di chuyển luồng
thread_struct, kiểm tra layout của task_struct bằng pahole, và dùng ftrace để xác định khi nào các luồng của tiến trình đang được debug được lên lịch chạy.
- Tác giả phát hiện đây có thể là một vấn đề hỏng bộ nhớ, vì luồng bị kẹt chỉ được lên lịch một lần, khác với các luồng khác.
- Tác giả đã triển khai một module Linux kernel để sử dụng hardware breakpoint trên Linux, và đặt hardware breakpoint vào trường
__state để xác định ai đã ghi vào đó.
- Tác giả phát hiện vấn đề là do tràn bộ đệm trong
ptrace_put_fpr (được API POKEUSER sử dụng), khiến các trường quan trọng của task_struct, chẳng hạn như __state, bị ghi đè.
- Vì vấn đề này có thể dẫn đến rủi ro bảo mật, tác giả đã gửi một bản vá tới nhóm bảo mật Linux kernel (
security@kernel.org) để khắc phục nó.
- Thay vì chấp nhận bản vá của tác giả, maintainer PowerPC là Michael Ellerman đã tự triển khai phiên bản sửa lỗi của riêng mình.
- Tác giả cảm thấy công việc của mình không được ghi nhận đúng mức, bị xem nhẹ và rất tức giận. Họ chỉ nhận được thẻ "Reported-by".
- Đóng góp kernel đầu tiên của tác giả là một trải nghiệm đầy thất vọng và nản lòng, với những cuộc trao đổi cùng những người dường như không coi trọng việc ghi nhận xứng đáng cho công sức của người khác.
1 bình luận
Ý kiến trên Hacker News