Mitmproxy 11: Hỗ trợ HTTP/3 hoàn chỉnh
(mitmproxy.org)- Khi tỷ trọng lưu lượng QUIC và HTTP/3 ngày càng tăng, mitmproxy 11 bật HTTP/3 theo mặc định để mở rộng phạm vi phân tích lưu lượng web hiện đại
- HTTP/3 hoạt động không chỉ trong proxy trong suốt và reverse proxy mà còn cả với WireGuard và local mode, nên có thể áp dụng trong nhiều môi trường capture khác nhau
- Chrome không tin cậy Certificate Authority do người dùng thêm vào khi dùng QUIC, nên cần chọn một trong các phương án: chứng chỉ được tin cậy công khai, cờ dòng lệnh, hoặc fallback về HTTP/2
- Phần triển khai DNS được chuyển sang dựa trên Hickory DNS, xử lý truy vấn ngoài A/AAAA, HTTPS records, DNS-over-TCP, kiểm soát hosts file và loại bỏ khóa ECH
- Các tính năng riêng tư như ECH khiến luồng tạo chứng chỉ của proxy trung gian trở nên khó khăn hơn, nhưng mitmproxy vẫn duy trì khả năng hoạt động bằng cách điều chỉnh phản hồi DNS
Phạm vi hỗ trợ HTTP/3
- mitmproxy 11 hỗ trợ HTTP/3 trong chế độ proxy trong suốt và reverse proxy
- Trong reverse proxy, một instance mitmproxy duy nhất nhận cả gói TCP và UDP và xử lý phiên bản HTTP được chuyển tiếp
- Ví dụ lệnh:
mitmproxy --mode reverse:https://http3.is
- Ví dụ lệnh:
- Có thể dùng HTTP/3 cả trong WireGuard và local mode
- Ví dụ lệnh:
mitmproxy --mode wireguard mitmproxy --mode local
- Ví dụ lệnh:
- Đã thử nghiệm với Firefox, Chrome, nhiều bản build cURL và các client khác để giảm vấn đề tương thích
- Công việc hỗ trợ HTTP/3 bắt đầu từ năm 2022 bởi Manuel Meitinger và Maximilian Hils, và được bật mặc định trong mitmproxy 11
Giới hạn chứng chỉ QUIC của Chrome
- Giới hạn lớn hiện được biết đến là Chrome không tin cậy Certificate Authority do người dùng thêm vào khi dùng QUIC
- Để xử lý lưu lượng HTTP/3 trong Chrome, cần một trong các cách sau
- Cung cấp chứng chỉ được tin cậy công khai như Let’s Encrypt
- Chạy Chrome kèm cờ dòng lệnh liên quan
- Chấp nhận hành vi fallback về HTTP/2
- Firefox không có hành vi như vậy
- Có thể xem mẹo xử lý sự cố HTTP/3 tại #7025
Tái triển khai dựa trên Hickory DNS
- Khi xuất hiện các tính năng riêng tư như DNS HTTPS records và Encrypted Client Hello(ECH), việc xử lý DNS của mitmproxy trở nên quan trọng hơn
- Phần triển khai DNS cũ có giới hạn vì dùng
getaddrinfo- Chỉ hỗ trợ truy vấn A/AAAA cho địa chỉ IPv4 và IPv6
- Không thể phản hồi các truy vấn như HTTPS records dùng để thông báo hỗ trợ HTTP/3
- mitmproxy 11 triển khai lại hỗ trợ DNS trên Hickory DNS, một thư viện DNS viết bằng Rust
- Thông qua Hickory, trên Windows, Linux và macOS có thể lấy nameserver mặc định của hệ điều hành và chuyển tiếp các truy vấn không phải A/AAAA đến nameserver đó
- Tùy chọn mới
dns_name_serverscho phép chỉ định nameserver đíchmitmdump --mode dns --set dns_name_servers=8.8.8.8
Kiểm soát hosts file và DNS-over-TCP
- Cùng với việc chuyển sang Hickory, một tùy chọn để bỏ qua hosts file của hệ thống đã được thêm vào
- Có thể dùng tùy chọn mới
dns_use_hosts_fileđể kiểm soát việc có áp dụng hosts file như/etc/hoststrên Linux hay không - Cũng có kế hoạch chuyển phần phân giải DNS nội bộ của mitmproxy sang Hickory; sau đó tính năng này sẽ hữu ích khi chuyển hướng trong suốt một domain cụ thể trên cùng máy
- Hiện tại, vì luôn xét hosts file nên trong cấu hình chuyển hướng trên cùng máy, mitmproxy có thể tự kết nối đệ quy đến chính nó
- Ví dụ hoạt động:
echo "192.0.2.1 mitmproxy.org" >> /etc/hosts mitmdump --mode dns dig @127.0.0.1 +short mitmproxy.org 192.0.2.1 mitmdump --mode dns --set dns_use_hosts_file=false dig @127.0.0.1 +short mitmproxy.org 3.161.82.13 - DNS mặc định dùng UDP, nhưng có thể cần TCP khi xử lý các bản ghi không vừa trong một gói UDP đơn lẻ
- Vì mitmproxy 11 hỗ trợ kiểu truy vấn tùy ý nên tầm quan trọng của kích thước thông điệp và xử lý TCP tăng lên, và DNS-over-TCP cũng hoạt động
Loại bỏ khóa ECH và tạo chứng chỉ
- mitmproxy dùng Server Name Indication(SNI) của TLS ClientHello để tạo chứng chỉ hợp lệ khi không có chứng chỉ tùy chỉnh
- Nếu không có SNI, có thể không tạo được chứng chỉ mà client sẽ tin cậy
- Encrypted Client Hello(ECH) là cơ chế mà client lấy khóa ECH từ DNS HTTPS records rồi mã hóa thông điệp bắt tay ClientHello ban đầu bằng khóa đó
- Nếu cả truy vấn DNS và bắt tay đều được mã hóa, proxy trung gian thụ động sẽ không biết domain đích mà chỉ thấy địa chỉ IP đích
- Trong môi trường shared hosting và Content Delivery Networks, rất khó xác định chính xác domain đích chỉ từ địa chỉ IP
- Cải tiến quyền riêng tư này xung đột với cách mitmproxy tạo chứng chỉ
- mitmproxy 11 loại bỏ khóa ECH khỏi HTTPS records để lấy được thông tin domain cần cho việc tạo chứng chỉ
- Client sẽ không lấy được khóa để mã hóa thông điệp bắt tay ban đầu
- mitmproxy có thể xác định domain đích và tạo chứng chỉ khớp
- ECH có thể khiến việc dùng mitmproxy trở nên khó hơn, nhưng đây cũng có thể được xem là một thay đổi giúp tăng quyền riêng tư trên web nói chung
1 bình luận
Ý kiến trên Hacker News
Thật vui khi thấy Mitmproxy vẫn còn được phát triển. Công cụ này đã gián tiếp tạo dựng sự nghiệp của tôi
Năm 2011, khi học phát triển API bằng cách chặn các request của ứng dụng di động, tôi phát hiện API của Airbnb bị lộ trước lỗ hổng gán hàng loạt của Rails (https://github.com/rails/rails/issues/5228). Sau khi thử thay đổi vài thuộc tính vô hại, tôi liên hệ với công ty, chuyện đó dẫn đến một buổi phỏng vấn, và phần còn lại thì đúng là lịch sử
Đôi khi gắn mitmproxy vào một triển khai hiện có còn dễ hơn đọc tài liệu
Điều thú vị là Chrome không tin cậy các cơ quan chứng thực do người dùng thêm vào trong QUIC
Trong issue liên quan, đội Chrome nói rằng “chúng tôi không chủ động cho phép các chứng chỉ không được tin cậy công khai, nhằm ngăn việc triển khai phần mềm/phần cứng chặn QUIC. Nếu không, về dài hạn sẽ làm hại khả năng tiến hóa của giao thức QUIC. Những trường hợp sử dụng dựa vào chứng chỉ không thuộc diện tin cậy công khai thì có thể dùng TLS+TCP thay cho QUIC”
Tôi không theo sát sự tiến hóa của giao thức, nhưng không rõ việc chặn chứng chỉ tùy chỉnh liên quan thế nào đến khả năng tiến hóa. Không biết có ai biết lý do không
Họ có thể đưa một phiên bản QUIC chỉnh sửa nhẹ vào Chrome, hỗ trợ nó ở những nơi như Youtube, rồi dựa trên các chỉ số đó để đề xuất thay đổi tiêu chuẩn “thật”, hoặc tiếp tục chạy một phiên bản đặc biệt chỉ trong dịch vụ của mình
Nếu cho phép chứng chỉ tùy chỉnh, các doanh nghiệp dùng những thứ như ZScaler ZIA để kiểm tra lưu lượng nhân viên theo kiểu trung gian có nguy cơ bị hỏng khi giao thức thay đổi. Nếu luồng dữ liệu được mã hóa hoàn toàn và trở nên mờ đục với thiết bị trung gian, Google gần như có thể làm bất cứ điều gì họ muốn
Khái niệm liên quan: https://en.wikipedia.org/wiki/Protocol_ossification
Với các giao thức có thể mở rộng, thường chỉ cần nâng cấp client và server, nhưng nếu có thiết bị trung gian thì có khả năng phải cập nhật thêm N thiết bị. Người dùng và nhà cung cấp dịch vụ có động lực áp dụng tính năng mới, còn chủ sở hữu thiết bị trung gian thì có thể không. Kết quả là giao thức khó tiến hóa hơn
Có nhiều middleware phụ thuộc mạnh vào chi tiết triển khai, nên chỉ cần thay đổi chút gì đó cũng dễ vô tình phá trải nghiệm người dùng. Có vẻ họ muốn tránh tình huống tương tự trong phiên bản mới
Tôi thắc mắc liệu HTTP/2 hoặc HTTP/3 có lợi ích gì không nếu chỉ được hỗ trợ ở reverse proxy chứ không phải ở web server thực tế
Hầu hết các framework chính trong JS/Python/Ruby không hỗ trợ các chuẩn HTTP mới. Vậy web server có trở thành nút thắt cổ chai của kết nối reverse proxy không?
Kết nối giữa reverse proxy và web server thực tế thường nhanh và ổn định hơn nhiều, nên lợi ích khi nâng đoạn đó lên HTTP/2 hoặc HTTP/3 nhỏ hơn nhiều
Ngay cả khi dùng HTTP, reverse proxy có thể thiết lập kết nối với backend nhanh hơn nhiều so với với client từ xa thực sự. Vì vậy dùng stream HTTP/2 trên đoạn chậm vẫn có lợi
Nó là công cụ chạy trên máy cục bộ để kiểm thử giao thức cấp thấp hoặc bảo mật web
Với HTTP/2 trở lên, nhiều request đồng thời được xử lý trên một kết nối
Vẫn còn vấn đề fingerprinting. Cho đến khi có thể bắt chước bắt tay TLS của một trình duyệt phổ biến, bạn sẽ thấy các trang kiểu “Just a quick check...” hoặc “Sorry, it looks like you're a bot” trên khoảng 80% web
https://github.com/mitmproxy/mitmproxy/issues/4575
Cảm ơn vì đã nhắc đến Hickory. Luôn thú vị khi thấy mọi người xây dựng gì với nó, và đây là một công việc được làm tốt
Những thứ như vậy vốn khó có được chỉ bằng Python
Tôi thắc mắc có thể dùng Mitmproxy như Privoxy/Proxomitron/Yarip không
Ví dụ khi duyệt bằng Ungoogled Chromium, có thể đặt Mitmproxy làm proxy và loại bỏ thẻ script của một số site cụ thể không? Hiệu năng sẽ bị ảnh hưởng thế nào?
Khi xem trang web, những độ trễ nhỏ cộng dồn hàng trăm lần có thể cảm nhận được
Dù vậy, với những ai quan tâm đến mục đích này thì đây có thể là một lựa chọn. Về mặt kỹ thuật không có gì ngăn cản
Khi viết lại file JavaScript, có một rủi ro nhỏ là đụng đến kiểm tra tính toàn vẹn tài nguyên con, nhưng nếu thật sự có vấn đề thì có lẽ cũng có thể viết lại cả hash để giải quyết
mitmproxy có thể là lựa chọn thay thế cho Fiddler không?
https://docs.mitmproxy.org/stable/addons-overview/
Ừm: https://github.com/mitmproxy/mitmproxy/issues/4170