"Don't Allow": công cụ tự động đóng hộp thoại xin quyền mạng nội bộ phiền toái trên macOS

Công nghệ29 tháng 10, 2026·6 phút đọc

Một lập trình viên đã phát triển ứng dụng Swift nhỏ gọn có tên dontallow, tự động bấm "Không cho phép" với hộp thoại xin quyền truy cập mạng nội bộ xuất hiện liên tục trên macOS Sequoia. Công cụ chạy nền, không tốn CPU khi rảnh và có thể triển khai hàng loạt cho doanh nghiệp.

"Don't Allow": công cụ tự động đóng hộp thoại xin quyền mạng nội bộ phiền toái trên macOS

"Don't Allow": công cụ tự động đóng hộp thoại xin quyền mạng nội bộ phiền toái trên macOS

Ai dùng macOS Sequoia chắc hẳn đều quen với hộp thoại "Allow 'Google Chrome' to find devices on local networks?" – câu hỏi xin quyền truy cập mạng nội bộ mà hệ thống hiển thị mỗi khi một ứng dụng lần đầu chạm vào mạng LAN. Vấn đề là với rất nhiều ứng dụng, lựa chọn của người dùng không được ghi nhớ, khiến hộp thoại này quay lại liên tục và cắt ngang công việc đang gõ dở.

Để giải quyết nỗi phiền này, một lập trình viên đã tung ra dontallow – một tiện ích Swift nhỏ gọn tự động bấm nút "Don't Allow" chỉ trong một phần tư giây, sau đó để lại một thông báo nhỏ cho biết nó vừa làm gì. Công cụ vừa được chia sẻ trên Hacker News và nhận được nhiều phản hồi tích cực từ cộng đồng.

Vì sao hộp thoại này lại dai dẳng đến vậy?

Theo tác giả, vấn đề nằm ở cách macOS xử lý quyền truy cập mạng nội bộ. Về lý thuyết, quyết định của người dùng phải được ghi nhớ, nhưng trên thực tế lại không phải lúc nào cũng vậy:

  • Trình duyệt nhân Chromium (Chrome, Brave, Edge, Island, Arc) sao chép gói ứng dụng vào một thư mục tạm ngẫu nhiên mỗi lần khởi chạy để giữ nguyên chữ ký mã khi cập nhật tại chỗ. macOS gắn quyết định với đường dẫn ngẫu nhiên đó, nên lần khởi chạy sau trông giống như một ứng dụng hoàn toàn mới.
  • Ứng dụng có đường dẫn cài đặt theo phiên bản (dạng .../versions/1.2.3/) sẽ sinh thêm một dòng mới trong phần Cài đặt quyền riêng tư sau mỗi lần cập nhật.
  • Hộp thoại bị gán nhầm ứng dụng: macOS gắn hộp thoại vào bất kỳ ứng dụng nào mà nó cho là "chịu trách nhiệm", nên đôi khi bạn thấy cảnh báo cho những ứng dụng chẳng hề chạy.

Hệ quả là danh sách trong Cài đặt quyền riêng tư dần đầy ắp những dòng "Google Chrome.app" trùng lặp không còn trỏ tới đâu cả. Và theo tác giả, không có cách chính thức nào để dọn danh sách này: không có cấu hình MDM để từ chối sẵn quyền, và lệnh tccutil reset cũng không áp dụng được cho trường hợp này.

"Hầu như không có ứng dụng nào trên một chiếc Mac thông thường thực sự cần quyền này, ngoại trừ tiện ích máy in, máy scan, máy chủ media hay công cụ tìm thiết bị trong LAN – mà những thứ đó bạn chỉ cần trả lời một lần là xong." – tác giả chia sẻ.

Cài đặt và sử dụng

Công cụ được cài đặt rất đơn giản qua Homebrew:

brew install johncassil/tap/dontallow
dontallow install

Lệnh install sẽ tạo một launchd agent cho từng người dùng, khởi động nó, mở Cài đặt hệ thống > Quyền riêng tư & Bảo mật > Trợ năng (Accessibility) và in ra đường dẫn chính xác để thêm vào nếu macOS không tự nhắc. Quyền Trợ năng là thứ cho phép công cụ "bấm nút" thay bạn.

Bộ lệnh đi kèm khá đầy đủ:

  • dontallow status: xem trạng thái agent, danh sách ứng dụng được phép, các lần đóng gần đây.
  • dontallow pause [1h]: tạm ngưng tự động đóng (30 phút, 2 giờ, 1 ngày hoặc vô thời hạn).
  • dontallow rules: giải mã kho quy tắc mạng nội bộ của hệ thống và hiển thị mỗi dòng trong Cài đặt quyền riêng tư thực sự là gì, kể cả các mục mồ côi.
  • dontallow uninstall: dừng và gỡ agent.
  • dontallow run --dry-run: chạy thử ở foreground, ghi log những gì nó sẽ làm mà không bấm gì cả.

Vẫn có thể cho phép khi cần

Nếu ứng dụng thực sự cần truy cập mạng nội bộ, tác giả đưa ra ba lựa chọn:

  • Dùng dontallow pause 10m, sau đó mở ứng dụng và tự bấm "Allow".
  • Thêm tên ứng dụng vào tệp ~/.config/dontallow/allowlist (mỗi dòng một tên, so khớp chuỗi con không phân biệt hoa thường).
  • Bật lại công tắc trong Cài đặt hệ thống > Quyền riêng tư & Bảo mật > Mạng nội bộ – một hộp thoại bị đóng sẽ ghi nhận quyết định "từ chối", và bạn có thể đảo ngược tại đây.

Ngoài ra, có thể đặt tệp ~/.config/dontallow/grace bằng số giây để có thêm thời gian bấm "Allow" trước khi agent can thiệp (mặc định là 0,25 giây).

Cách hoạt động bên trong

Về mặt kỹ thuật, hộp thoại này là một cửa sổ thuộc tiến trình hệ thống UserNotificationCenter. dontallow đăng ký một Accessibility observer để theo dõi việc tạo cửa sổ mới trên tiến trình đó và ngủ cho đến khi có sự kiện. Khi đó, nó đọc nội dung hộp thoại, xác nhận đây đúng là cảnh báo mạng nội bộ chứ không phải thứ gì khác, kiểm tra trạng thái tạm ngưng và allowlist, rồi thực hiện thao tác nhấn qua Accessibility lên nút "Don't Allow". Nếu thao tác nhấn bị từ chối, nó chuyển sang giả lập click chuột tại vị trí nút.

Điểm đáng chú ý: công cụ không bao giờ sửa tệp hệ thống, không vô hiệu hóa các lớp bảo vệ và không bao giờ chọn "Allow".

Dành cho môi trường doanh nghiệp

Quyền Mạng nội bộ không thể đặt sẵn qua MDM, nhưng quyền Trợ năng thì có. Với một đội máy lớn, quản trị viên có thể build một lần, ký bằng Developer ID, triển khai binary kèm một profile PPPC (Privacy Preferences Policy Control) cấp quyền Trợ năng theo code requirement, rồi chạy dontallow install cho từng người dùng – không cần thao tác thủ công nào trong Cài đặt.

Lưu ý về tương thích

Công cụ biên dịch chỉ với Command Line Tools của Apple, không cần Xcode hay SwiftPM, và chạy native trên cả Apple Silicon lẫn Intel. Yêu cầu macOS 13 trở lên để build, nhưng hộp thoại gốc chỉ tồn tại từ macOS 15 Sequoia trở đi. Hiện tại công cụ mới chỉ hỗ trợ macOS bản tiếng Anh, do bộ nhận diện dựa vào nội dung văn bản hộp thoại và tiêu đề nút "Don't Allow"; các bản ngôn ngữ khác đang được lên kế hoạch.

Một lưu ý nhỏ sau khi nâng cấp: macOS gắn quyền Trợ năng với chữ ký mã của binary, mà mỗi bản build mới (kể cả qua brew upgrade) lại tạo ra chữ ký mới. Sau khi nâng cấp, bạn nên chạy dontallow status; nếu báo thiếu quyền, hãy xóa dòng dontallow trong phần Trợ năng rồi thêm lại từ đường dẫn mà công cụ in ra. Agent sẽ tự kết nối lại trong vòng mười giây.

Dự án được phát hành theo giấy phép MIT, với đầy đủ unit test cho phần logic thuần (phân tích văn bản hộp thoại, xử lý thời lượng tạm ngưng, so khớp allowlist, tạo plist launchd và giải mã kho quy tắc mạng nội bộ).

Với những ai từng bực mình vì bị hộp thoại này cắt ngang dòng đang gõ, đây rõ ràng là một giải pháp nhỏ nhưng đúng "nỗi đau" – và đó cũng là lý do nó nhanh chóng thu hút sự chú ý của cộng đồng công nghệ.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗