Quy tắc rất đơn giản: chỉ lọc lưu lượng khi điện thoại đang kết nối với Wi-Fi của văn phòng. Nó đứng vững hàng tháng trời, rồi một buổi sáng điện thoại vẫn ở trên đúng SSID đó với đúng biểu tượng chìa khóa ấy mà việc lọc đã dừng. Không có gì thay đổi ở mạng; thứ đã thay đổi là liệu ứng dụng có nhìn thấy tên mạng hay không. Trên Android, «tôi đang ở Wi-Fi nào» và «chặn lưu lượng này» là hai việc riêng biệt, và một tường lửa trộn lẫn hai việc ấy sẽ thất bại mở đúng vào lúc cái tên không còn khả dụng.

Triệu chứng: danh tính biến mất và chính sách đi theo

Một quy tắc theo SSID đọc một giá trị rồi chọn một nhánh. Khi lần đọc không trả về gì hữu ích, mã buộc phải làm gì đó, và mặc định thường thấy là «không phải mạng mong đợi, nên đừng lọc». Mặc định đó biến một vấn đề quyền thành một lỗ rò lưu lượng. Biểu tượng chìa khóa vẫn hiện vì dịch vụ VPN còn chạy; nó chỉ đang thực thi một nhánh khác.

Hãy nhìn vào thứ tự sự việc, không nhìn vào mạng. Một hộp thoại quyền bị từ chối, một bản cập nhật hệ thống đẩy quyền truy cập SSID ra sau một quyền khác, dịch vụ vị trí bị tắt, hay một thay đổi chính sách hồ sơ công việc đều có thể tạo ra cùng kết quả trong khi điện thoại vẫn ở đúng điểm truy cập ấy.

Vì sao cái tên có thể trở về là không xác định

WifiInfo.getSSID() trả về định danh bộ dịch vụ của mạng hiện tại, và Android ghi rõ rằng quyền truy cập vào các trường nhạy cảm về vị trí phụ thuộc vào quyền. Khi không có quyền truy cập, lời gọi trả về UNKNOWN_SSID thay vì thất bại ồn ào. Vì thế một giá trị rỗng hoặc không xác định không phải bằng chứng điện thoại đã rời Wi-Fi; đó là bằng chứng ứng dụng không thể phân loại mạng.

Hai bước kiểm tra phân tách các trường hợp. Xác nhận điện thoại đã liên kết và xem hệ thống báo gì, rồi xác nhận ứng dụng thực sự có quyền cần thiết trên bản Android này:

adb shell cmd wifi status
adb shell dumpsys package <your.app> | grep -i -E "ACCESS_FINE_LOCATION|NEARBY_WIFI_DEVICES"

Nếu dòng trạng thái hiển thị một mạng đã kết nối trong khi ứng dụng thấy tên không xác định, bạn đang gặp vấn đề về quyền hoặc mức API, không phải vấn đề Wi-Fi. Hãy sửa điều đó trước khi chạm vào các quy tắc tường lửa, vì mọi quy tắc phía sau đều được đánh giá dựa trên một giá trị mà ứng dụng không đọc được.

Việc lọc thực sự chạy ở đâu

Tường lửa cục bộ trên Android thường dùng mô hình VpnService mà không gửi lưu lượng đến máy chủ từ xa: nó nhận giao diện ảo, áp dụng quy tắc riêng và chuyển tiếp những gì nó cho phép. Nền tảng chỉ cho phép một dịch vụ VPN đang hoạt động cho mỗi hồ sơ người dùng, và cái thứ hai thay thế cái thứ nhất chứ không xếp chồng lên. Vì vậy một ứng dụng tường lửa riêng và một VPN công việc riêng không tạo thành chuỗi hai tầng; một trong hai sẽ thắng.

Điều đó quan trọng với một quy tắc theo SSID vì điểm thực thi và điểm quan sát là hai thành phần khác nhau. VpnService quyết định cái gì rời khỏi thiết bị; API Wi-Fi chỉ cung cấp một nhãn. Một ứng dụng có thể thực thi đúng mà phân loại sai, và đó chính xác là lỗi trong bài này.

Trao cho trạng thái không xác định chính sách riêng

Hãy coi danh tính mạng là ba trạng thái, và viết chính sách cho từng trạng thái trước khi phát hành quy tắc. Trạng thái thứ ba là trạng thái bị lãng quên, và kẻ tấn công hay một cấu hình sai sẽ đặt bạn vào đúng đó.

ObservationPolicy to specify
Expected SSID is readableThe explicit filtering policy you designed
A different SSID is readableThe default policy for untrusted networks
Unknown, changing or unreadableFail closed until classification is reliable

Thất bại đóng nghĩa là trạng thái không xác định thừa hưởng chính sách hợp lý nghiêm ngặt nhất chứ không phải chính sách tiện lợi nhất. Nếu điều đó khiến điện thoại không dùng được trên mạng mới, giải pháp đúng là một ngoại lệ có chủ đích và nhìn thấy được, không phải một quyết định tin cậy âm thầm giấu trong phép kiểm tra giá trị rỗng.

Một SSID quen thuộc là nhãn, không phải bằng chứng về nhà vận hành mạng. Bất kỳ ai cũng có thể dựng một điểm truy cập mang tên văn phòng, nên việc trùng tên không bao giờ được là thứ duy nhất đứng giữa một phiên nhạy cảm và một phân đoạn không tin cậy.

Kiểm thử các chuyển tiếp, không phải trạng thái ổn định

Kiểm thử ở trạng thái ổn định đều đạt trên mạng nơi bạn dựng quy tắc. Lỗi sống trong các chuyển tiếp: quyền bị từ chối, Wi-Fi sang dữ liệu di động, SSID này sang SSID khác, dịch vụ VPN khởi động lại và một ứng dụng VPN khác chiếm giao diện. Với mỗi trường hợp, hãy quyết định xem các kết nối hiện có có được xem xét lại không và lưu lượng được bảo vệ có còn bị chặn trong khi trạng thái chưa xác định không.

Viết kết quả thành ba câu: điều kiện quan sát được, thành phần thực thi quyết định và phương án dự phòng có chủ đích. Nếu thiếu một trong ba, quy tắc chưa phải chính sách; đó là một phỏng đoán tình cờ chạy được trên mạng văn phòng.

Bài viết liên quan