Một handshake VPN thất bại có thực sự là tấn công hạ cấp?
Tấn công hạ cấp có tồn tại, nhưng phần lớn handshake thất bại là do đề xuất không khớp, tuyến đường sai hoặc hồ sơ đã hết hạn. Hãy kiểm tra trước xem đã thương lượng gì.
Một handshake kết thúc bằng lỗi có cảm giác như bị tấn công cho đến khi bạn nhìn vào thông điệp, và phần lớn thời gian đó là số học: không có đề xuất chung, chứng thư đã hết hạn, hoặc một gói tin không bao giờ đến. Tấn công hạ cấp là một thứ cụ thể: kẻ tấn công đẩy cả hai đầu về hành vi yếu hơn mức chúng sẽ chọn, và nó để lại bằng chứng khác. Coi mọi thất bại là ác ý khiến bạn đi tìm một nạn nhân có thể không tồn tại, trong khi coi một cuộc hạ cấp thật là lỗi cấu hình lại để kết quả yếu hơn nằm nguyên đó. Hai sai lầm có giá khác nhau, và chỉ một trong hai là rẻ để sửa.
Tấn công hạ cấp thực sự thay đổi điều gì
Mục tiêu không phải bẻ khóa mật mã và cũng không phải đoán khóa. Mục tiêu là tác động lên thương lượng để hai bên dừng ở một phiên bản cũ hơn hoặc một thuật toán yếu hơn mà kẻ tấn công xử lý được, hoặc làm một bên tin rằng bên kia chỉ hỗ trợ điều đó.
Thứ thay đổi là thỏa thuận, không phải xác thực. Nếu kẻ tấn công sửa được đề xuất mà không bị phát hiện, các bên vẫn có thể hoàn tất handshake và vẫn xác thực lẫn nhau, nhưng với tham số mà kẻ tấn công ưa thích. Vì thế câu hỏi đáng quan tâm là liệu bản thân cuộc thương lượng có được bảo vệ toàn vẹn hay không.
Vì sao bản thân cuộc thương lượng phải được xác thực
TLS 1.3 làm rõ sự bảo vệ đó. Một ứng dụng khách đã đề xuất phiên bản mới hơn có thể phát hiện máy chủ lặng lẽ lùi lại, vì giá trị ngẫu nhiên của máy chủ mang một mẫu cố định khi nó thương lượng 1.2 hoặc thấp hơn, và ứng dụng khách buộc phải hủy khi thấy điều đó. Toàn bộ bản ghi cũng được các thông điệp kết thúc bao phủ, nên một thay đổi ở bất kỳ đâu trong thương lượng sẽ thất bại về sau thay vì lặng lẽ đi qua.
Các phiên bản giao thức cũ có câu chuyện yếu hơn, và chính vì thế các quy tắc lùi lại mới quan trọng. Một điểm cuối TLS 1.0 trong cùng cấu hình không phải là tấn công hạ cấp; đó là kết quả được phép mà bạn đã chọn cho phép. Khác biệt nằm ở chỗ kết quả yếu hơn đến từ một quyết định được bảo vệ hay từ một đường đi không được bảo vệ mà kẻ trung gian có thể tác động. Một khi diễn đạt như vậy, phần lớn sự cố trở thành câu hỏi cấu hình.
IKEv2 hành xử khác nhưng dựa trên cùng ý tưởng. Đề xuất được mang trong một trao đổi mà sau đó xác thực cả hai bên, nên một hộp giữa viết lại thuật toán sẽ phá xác thực thay vì dẫn dắt nó. Kênh điều khiển của OpenVPN bảo vệ thương lượng của nó bằng TLS rồi dùng kênh đó để thống nhất mật mã của kênh dữ liệu, vì thế dòng nhật ký của kênh điều khiển mới là dòng đáng chú ý.
Tương thích được cấu hình không phải là tấn công
Quản trị viên có thể cố ý cho phép các lựa chọn cũ hơn để hỗ trợ một ứng dụng khách có tài liệu, và quyết định đó hiện ra trong cấu hình. Kẻ tấn công không thể tạo ra cấu hình đó; chúng chỉ có thể lợi dụng một đường đi cho phép chúng tác động lên đề xuất.
Bản sửa nguy hiểm là bản xóa bằng chứng về khác biệt. Bật mọi tùy chọn cũ, tắt kiểm tra chứng thư hoặc chấp nhận bất kỳ mật mã nào để lỗi biến mất sẽ mở rộng thứ mà điểm cuối sẽ đồng ý, và xóa bỏ các kiểm tra lẽ ra phải báo cáo kết quả yếu hơn.
Nếu phải giữ một tùy chọn cũ, hãy nêu lý do và ứng dụng khách trong chú thích cấu hình, rồi giới hạn tùy chọn đó cho hồ sơ cần nó. Một ngoại lệ tương thích giới hạn ở một trình lắng nghe thì kiểm toán được; ngoại lệ áp dụng toàn cục chỉ là một giá trị mặc định yếu hơn mà không ai nhớ đã chọn.
Đọc lỗi trước khi gọi tên nguyên nhân
Giữ nguyên chuỗi lỗi chính xác, phiên bản ứng dụng khách và máy chủ cùng thời điểm trước mọi thay đổi. Sau đó phân loại: hai bên bất đồng về đề xuất, đường đi của gói tin thất bại, hay một bên từ chối tham số mà nó từng chấp nhận?
Không khớp đề xuất thường nêu tên phiên bản hoặc thuật toán có lỗi và thất bại ở cùng một điểm mỗi lần. Sự cố định tuyến hoặc MTU bị kẹt hoặc hết thời gian, và thường thay đổi theo mạng. Chứng thư hết hạn tạo ra lỗi kiểm tra chứ không phải lỗi thương lượng.
Không điều nào trong số đó là bằng chứng về kẻ tấn công. Gán nguyên nhân độc hại ngay ở thất bại đầu tiên chính là sai lầm, vì nó che giấu lỗi tất định sẽ lại thất bại vào ngày mai.
Xác nhận điều gì thực sự được chọn
Sau mọi chỉnh sửa, hãy đọc kết quả đã thương lượng thay vì tin rằng kết nối đã lên. Một kết nối thành công vì đã bỏ kiểm tra chính là kết quả bạn muốn tránh. Hai lệnh dưới đây hiển thị phiên bản và mật mã được chọn cho một điểm cuối có TLS phía trước, cùng dòng kênh điều khiển từ nhật ký của máy chủ OpenVPN.
openssl s_client -connect 198.51.100.30:443 -servername vpn.example.net -brief </dev/null
grep -iE 'Control Channel|Data Channel' /var/log/openvpn.log | tail -5So sánh kết quả với cấu hình bạn dự định, không phải với thứ đang kết nối. Nếu phiên bản được chọn cũ hơn mức tối thiểu được phép, hồ sơ hoặc danh sách lùi lại là nơi cần xem, và câu trả lời là sửa danh sách đó, không phải tuyên bố bị tấn công và xây lại mọi thứ quanh nó.