Lỗ hổng iTerm2: Ngay cả lệnh "cat readme.txt" cũng có thể thực thi mã độc
Một lệnh tưởng chừng vô hại như cat readme.txt có thể dẫn đến việc thực thi mã tùy ý trên iTerm2 do lỗi trong tính năng tích hợp SSH. Vấn đề nằm ở việc ứng dụng này tin tưởng vào các chuỗi thoát terminal từ đầu ra không đáng tin cậy, cho phép kẻ tấn công mạo danh giao thức conductor.

Trong bài viết trước về các lỗi do AI phát hiện trong Vim và Emacs, chúng ta đã thấy cách các quy trình làm việc tưởng chừng vô hại có thể vượt qua ranh giới bất ngờ để thực thi mã. Lần này, chúng ta đẩy ý tưởng đó xa hơn nữa: liệu lệnh cat readme.txt có an toàn không?
Câu trả lời là KHÔNG, nếu bạn đang sử dụng iTerm2.
Điều này nghe có vẻ điên rồ cho đến khi bạn hiểu iTerm2 đang cố gắng làm gì cho một tính năng hợp pháp, cách nó sử dụng PTY (pseudoterminal), và điều gì xảy ra khi đầu ra của terminal có thể mạo danh một phía của giao thức tính năng đó.
Bối cảnh: Tích hợp SSH của iTerm2
iTerm2 có tính năng tích hợp SSH giúp nó hiểu rõ hơn về các phiên làm việc từ xa. Để hoạt động, nó không chỉ "gõ lệnh mù quáng" vào một shell từ xa. Thay vào đó, nó khởi động một script trợ giúp nhỏ ở phía máy từ xa gọi là conductor.
Mô hình hoạt động大致 như sau:
- iTerm2 khởi chạy tích hợp SSH, thường thông qua
it2ssh. - iTerm2 gửi một script khởi động từ xa (conductor) qua phiên SSH hiện có.
- Script từ xa này trở thành đối tác giao thức của iTerm2.
- iTerm2 và conductor từ xa trao đổi các chuỗi thoát terminal để điều phối các việc như: phát hiện shell đăng nhập, kiểm tra Python, thay đổi thư mục, tải lên tệp và chạy lệnh.
Điểm quan trọng là không có dịch vụ mạng riêng biệt nào ở đây. Conductor chỉ là một script chạy bên trong phiên shell từ xa, và giao thức được truyền qua I/O terminal bình thường.
Lỗi cốt lõi: Lỗi tin cậy
Lỗi này là một sự thất bại trong việc xác thực tin cậy. iTerm2 chấp nhận giao thức conductor từ đầu ra terminal không thực sự đến từ một phiên conductor đáng tin cậy. Nói cách khác, đầu ra terminal không đáng tin cậy có thể mạo danh conductor từ xa.
Điều này có nghĩa là một tệp độc hại, phản hồi máy chủ, banner hoặc MOTD (tin nhắn của ngày) có thể in ra:
- Một hook DCS 2000p giả mạo.
- Các câu trả lời OSC 135 giả mạo.
Và iTerm2 sẽ bắt đầu hành động như thể nó đang ở giữa một trao đổi tích hợp SSH thực sự. Đó là nguyên thủy của cuộc tấn công.
Cơ chế khai thác thực sự
Tệp khai thác chứa một bản ghi (transcript) conductor giả. Khi nạn nhân chạy:
cat readme.txt
iTerm2 hiển thị tệp, nhưng tệp đó không chỉ là văn bản. Nó chứa:
- Một dòng DCS 2000p giả thông báo một phiên conductor.
- Các thông điệp OSC 135 giả trả lời các yêu cầu của iTerm2.
Khi hook được chấp nhận, iTerm2 bắt đầu quy trình làm việc conductor bình thường. Trong mã nguồn, Conductor.start() ngay lập tức gửi getshell(), và sau khi thành công, nó gửi pythonversion().
Do đó, cuộc khai thác không cần chèn các yêu cầu đó. iTerm2 tự phát ra chúng, và đầu ra độc hại chỉ cần mạo danh các câu trả lời.
Sự nhầm lẫn PTY khiến khai thác trở nên khả thi
Trong một phiên tích hợp SSH hợp pháp, iTerm2 ghi các lệnh conductor được mã hóa base64 vào PTY, và ssh chuyển tiếp chúng đến conductor từ xa. Trong trường hợp khai thác, iTerm2 vẫn ghi các lệnh đó vào PTY, nhưng không có conductor SSH thực sự nào cả. Shell cục bộ nhận chúng dưới dạng đầu vào thuần túy thay thế.
Đó là lý do phiên trông như thế này khi được ghi lại:
getshellxuất hiện dưới dạng base64.pythonversionxuất hiện dưới dạng base64.- Sau đó là một tải trọng
run ...dài được mã hóa base64. - Đoạn cuối cùng là
ace/c+aliFIo.
Các đoạn trước đó thất bại như các lệnh vô nghĩa. Đoạn cuối cùng sẽ hoạt động nếu đường dẫn đó tồn tại cục bộ và có thể thực thi.
Tham số sshargs và đường dẫn tệp
Hook DCS 2000p giả mạo chứa một số trường, bao gồm sshargs do kẻ tấn công kiểm soát. Giá trị này quan trọng vì iTerm2 sau đó sử dụng nó làm nguyên liệu lệnh khi nó xây dựng yêu cầu run ... của conductor.
Cuộc khai thác chọn sshargs sao cho khi iTerm2 mã hóa base64 lệnh run, đoạn 128 byte cuối cùng trở thành: ace/c+aliFIo.
Chuỗi này không phải là ngẫu nhiên. Nó được chọn vì nó vừa là:
- Đầu ra hợp lệ từ đường dẫn mã hóa conductor.
- Một tên đường dẫn tương đối hợp lệ.
Dòng thời gian công bố
- 30/3: Chúng tôi đã báo cáo lỗi này cho iTerm2.
- 31/3: Lỗi đã được sửa trong commit
a9e745993c2e2cbb30b884a16617cd5495899f86.
Tại thời điểm viết bài, bản sửa lỗi này chưa được đưa vào các bản phát hành ổn định. Người dùng nên cập nhật iTerm2 ngay khi bản vá chính thức được phát hành để tránh nguy cơ bị tấn công thông qua các tệp tin có nội dung được chế tạo đặc biệt.


