Bảo mật trong giao tiếp UI và service (IPC)

Published By: RD TEAM

Published On: 01/12/2025

Published in:

Lời mở đầu

Trong thời đại toàn cầu hóa hiện nay, nhu cầu trao đổi thông tin, dữ liệu thông qua nhiều kênh, phương tiện khác nhau đã không còn điều gì xa lạ. Bên cạnh việc đáp ứng nhu cầu này một cách nhanh và tiện lợi thì việc bảo mật để tránh lộ, lọt các thông tin, dữ liệu nhằm đảm bảo quyền riêng tư của người dùng đang ngày càng được quan tâm hơn. Chúng ta thường lo lắng về việc trình duyệt web bị theo dõi hay điện thoại bị nhiễm mã độc và tìm cách cố gắng khắc phục, nhưng lại ít khi nghi ngờ chính những phần mềm Desktop mà do "chính chủ" thực hiện cài đặt. Sự thật là, lượng dữ liệu nhạy cảm mà các app này xử lý và truyền tải là rất lớn: từ thông tin đăng nhập, dữ liệu cá nhân, cho đến các bản thiết kế, tài liệu mật chúng đều cần cập nhật dữ liệu, xác thực người dùng, hoặc tải về các tài nguyên từ xa.

Giao diện người dùng (UI) mà bạn tương tác hàng ngày thực chất chỉ là "phần nổi của tảng băng", phần lớn logic nghiệp vụ và dữ liệu đều nằm ở các service phía sau. Tuy nhiên, có một nghịch lý thường thấy: trong khi các nhà phát triển dành rất nhiều tâm sức cho việc bảo mật website và mobile app, thì kiến trúc giao tiếp của ứng dụng Desktop lại đôi khi bị xem nhẹ. Hệ quả là các kênh trao đổi dữ liệu giữa UI Desktop và service back-end trở thành "cửa hậu" lý tưởng cho cho các hình thức tấn công như Man-in-the-Middle (MITM), replay attack, hoặc khai thác lỗ hổng API, biến những tính năng hữu ích thành điểm yếu chết người. Một ví dụ điển hình là vào năm 2021, Hacker đã khai thác một phương thức IPC cơ bản là Named Pipe để đánh cắp dữ liệu người dùng.

Vậy, làm thế nào để biến kênh giao tiếp trong ứng dụng Desktop từ một "cửa hậu" nguy hiểm trở thành một "pháo đài" kiên cố? Bài viết này sẽ đi sâu phân tích các mối đe dọa này và trang bị những giải pháp thiết thực để xây dựng một kênh giao tiếp an toàn, vững chắc cho ứng dụng Desktop.

Một Số Phương Thức IPC Phổ Biến Cho Ứng Dụng Desktop

Khi kiến trúc một ứng dụng Desktop hiện đại, việc tách biệt giao diện người dùng (UI) và các tầng xử lý nghiệp vụ (Service/Backend) là hết sức phổ biến. Sự tách biệt này đòi hỏi một cơ chế giao tiếp hiệu quả và an toàn. Dưới đây một số phương thức IPC hàng đầu, được ưa chuộng nhờ vào sự cân bằng giữa hiệu năng, độ tin cậy và tính khả dụng.

1. Named Pipe

Named Pipe, hay FIFO, là một kênh giao tiếp được định danh bằng một tập tin đặc biệt trong hệ thống, cho phép truyền tải dữ liệu một chiều hoặc hai chiều giữa các tiến trình không có quan hệ cha-con. Sức mạnh then chốt của Named Pipe nằm ở khả năng cân bằng tuyệt vời giữa tốc độ, độ tin cậy và tính linh hoạt. Nó hỗ trợ kiểm soát quyền truy cập dựa trên hệ thống tập tin, cho phép các tiến trình chạy với các quyền người dùng khác nhau vẫn có thể giao tiếp một cách có kiểm soát.

Named Pipe
Hình 1. Phương thức Named Pipe

Trong thực tế, Named Pipe là xương sống của nhiều nền tảng phần mềm:

  • Các trình duyệt như Chrome hay Edge sử dụng rộng rãi Named Pipe để giao tiếp giữa process trình duyệt chính và các process renderer cho từng tab, nhằm tạo ra một "vùng cát" (sandbox) bảo mật, cách ly lỗi và ngăn chặn các tab độc hại ảnh hưởng đến toàn bộ ứng dụng.

  • Các ứng dụng quản lý mật khẩu (VD: KeePass1Password) thường xuyên dùng Named Pipe để phần giao diện chính ra lệnh cho một service chạy nền thực hiện nhiệm vụ tự động điền thông tin đăng nhập vào các trình duyệt web một cách an toàn.

2. Unix Domain Socket

Nếu đã quen thuộc với socket mạng (network socket), Unix Domain Socket chính là phiên bản dành cho giao tiếp nội bộ.

Phương thức Unix Domain Socket
Hình 2. Phương thức Unix Domain Socket

Phương thức này sử dụng một file socket đặc biệt trên ổ đĩa làm điểm kết nối, hỗ trợ cả hai chế độ truyền tin hướng kết nối (stream) và không kết nối (datagram). Ưu thế của Unix Domain Socket là tính linh hoạt cao, cho phép mô phỏng hoàn hảo mô hình client-server ngay trên một máy tính. Cơ chế kiểm soát quyền truy cập thông qua quyền của file socket mang lại một lớp bảo mật vững chắc. Các triển khai điển hình bao gồm:

  • Docker Desktop: Docker daemon (service) lắng nghe các yêu cầu thông qua một Unix Domain Socket. Khi người dùng chạy lệnh docker từ terminal (client), lệnh này sẽ kết nối đến socket đó để giao tiếp với daemon.

  • Các hệ quản trị cơ sở dữ liệu như PostgreSQL hoặc MySQL, khi được cài đặt trên cùng máy với ứng dụng, thường ưu tiên sử dụng Unix Domain Socket thay vì TCP socket để loại bỏ chi phí xử lý giao thức mạng, từ đó tối ưu hóa hiệu suất kết nối.

3. RPC (Remote Procedure Call)

RPC là một bước tiến trong việc trừu tượng hóa giao tiếp liên tiến trình. Với RPC, developer có thể gọi một hàm từ xa y như đang gọi một hàm cục bộ. Các framework hiện đại như gRPC hay Thrift tự động xử lý mọi công đoạn phức tạp phía sau, từ tuần tự hóa dữ liệu đến truyền tải thông điệp. Giá trị cốt lõi của RPC nằm ở khả năng giúp code sạch sẽ, dễ bảo trì và mở rộng. Giao thức được định nghĩa rõ ràng (thông qua file proto trong gRPC) và hỗ trợ đa ngôn ngữ lập trình, cho phép team phát triển xây dựng UI bằng C# trong khi viết service bằng Go hoặc Python.

Phương thức RPC
Hình 3. Phương thức RPC

Phương thức này đặc biệt phù hợp cho:

  • Kiến trúc Microservices trong ứng dụng Desktop: Một ứng dụng phức tạp có thể được chia nhỏ thành các service độc lập (xử lý người dùng, xử lý dữ liệu, v.v.). Lúc này, UI đóng vai trò như một client, gọi đến các service này thông qua gRPC để thực hiện các tác vụ chuyên biệt.

4. D-Bus
Phương thức D-Bus
Hình 4. Phương thức D-Bus

D-Bus không đơn thuần là một cơ chế IPC, mà là một message bus hệ thống cao cấp, được thiết kế đặc biệt cho môi trường desktop. Nó cho phép các ứng dụng và service "phát sóng" sự kiện hoặc gọi phương thức của nhau một cách dễ dàng. Điểm khác biệt lớn nhất của D-Bus là cơ chế "tự động khám phá" (discover) service, cho phép một ứng dụng biết được dịch vụ nào đang có sẵn trên hệ thống và chúng cung cấp những phương thức gì. D-Bus hiện diện trong hầu hết các ứng dụng trên Linux:

  • Dột ứng dụng nghe nhạc có thể gửi một signal qua D-Bus để ra lệnh cho service phát nhạc chuyển bài kế tiếp, tạm dừng hoặc tăng âm lượng.

  • Trình quản lý kết nối mạng (NetworkManager) cung cấp một giao diện D-Bus, cho phép các ứng dụng cài đặt mạng (UI) gọi method để bật/tắt WiFi hay Ethernet.Các cuộc tấn công khai thác lỗ hổng trong các phương thức IPC.

- Cuộc Tấn Công "ProxyLogon" Vào Microsoft Exchange Server (2021)

minh họa cuộc tấn công “ProxyLogon”
Hình 5. Hình minh họa cuộc tấn công “ProxyLogon”

Như đã đề cập ở phần mở đầu, đây là một cuộc tấn công mà Hacker đã khai thác phương thức Named Pipe. Cụ thể, chúng khai thác các lỗ hổng trong máy chủ Microsoft Exchange (CVE-2000-0535, CVE-2021-26855, CVE-2022-30216, v.v.) để tấn công vào các đường ống không được bảo vệ đúng cách nhằm thực thi mã từ xa. Sau khi xâm nhập, chúng chạy mã với quyền của hệ thống Exchange (MSExchange Unified Messaging service). Mã độc sau đó tạo ra một Named Pipe có tên cụ thể (\\.\pipe\test\System\Security\Cryptography\pkcs12key). Vấn đề then chốt là một thành phần khác của Exchange cũng chạy với quyền SYSTEM và sử dụng cùng một Named Pipe đó để giao tiếp nội bộ. Nó được lập trình để tin tưởng bất kỳ dữ liệu nào nhận được từ Named Pipe này và bằng cách giả mạo Named Pipe, chúng đã "lừa" service UM tin rằng dữ liệu chúng gửi đi là hợp lệ. Từ đó, chúng ra lệnh cho service UM ghi một file web shell (một backdoor) vào thư mục web của Exchange. Web shell này cho phép hacker chiếm hoàn toàn quyền kiểm soát máy chủ email và đánh cắp toàn bộ dữ liệu.

=> Ngay cả một cơ chế IPC cơ bản như Named Pipe cũng có thể trở thành mắt xích then chốt trong một chuỗi tấn công phức tạp nếu nó thiếu cơ chế xác thực nghiêm ngặt giữa các process. Sự mặc định tin tưởng vào dữ liệu từ IPC là một sai lầm có thể dẫn đến hậu quả khó lường.

- Cuộc Tấn Công "PetitPotam" Khai Thác MS-EFSRPC (2021)

Đây là một minh chứng rõ ràng cho thấy sự nguy hiểm khi một giao diện RPC mạnh mẽ nhưng lại được bảo vệ kém. Cuộc tấn công PetitPotam khai thác giao diện MS-EFSRPC (Encrypting File System Remote Protocol) - một giao thức RPC của Windows - để buộc một máy chủ Windows (như Domain Controller) xác thực với một máy chủ do kẻ tấn công kiểm soát.

cuộc tấn công “PetitPotam”
Hình 6. Hình minh họa cuộc tấn công “PetitPotam”

Thay vì tấn công trực tiếp vào lỗ hổng tràn bộ đệm, PetitPotam lợi dụng logic nghiệp vụ của RPC. Kẻ tấn công, từ một máy trạm thông thường trong mạng nội bộ, gửi một yêu cầu RPC đặc biệt đến máy chủ mục tiêu. Yêu cầu này ra lệnh cho máy chủ mục tiêu kết nối trở lại và xác thực với một máy chủ SMB giả mạo (do kẻ tấn công điều khiển) bằng giao thức NTLM. Bằng cách này, kẻ tấn công có thể đánh cắp hash mật khẩu NTLM của chính tài khoản máy chủ (thường là tài khoản có đặc quyền cao trong Domain). Hash này sau đó có thể được sử dụng trong các cuộc tấn công "Pass-the-Hash" để leo thang đặc quyền, chiếm quyền điều khiển Domain Controller, và từ đó toàn bộ hệ thống mạng.

=> Cuộc tấn công này nhấn mạnh rằng ngay cả những framework IPC/RPC hiện đại cũng không tự động an toàn. Nó cho thấy việc kiểm soát chặt chẽ các endpoint RPC, vô hiệu hóa các giao thức kế thừa không cần thiết và áp dụng nguyên tắc đặc quyền tối thiểu là vô cùng quan trọng.

- Các Cuộc Tấn Công Vào Ứng Dụng Desktop Thông Qua D-Bus

Đây là một mục tiêu phổ biến trên môi trường Linux Desktop khi nhiều ứng dụng desktop (trình duyệt, trình quản lý file, phần mềm cài đặt) cung cấp các "service" hoặc "method" trên bus D-Bus để các ứng dụng khác có thể gọi mà nếu chúng được cấu hình lỏng lẻo thì một ứng dụng độc hại có thể thực hiện những hành vi không mong muốn như Ra lệnh cho trình duyệt mở một trang web lừa đảo, Yêu cầu trình quản lý file sao chép dữ liệu nhạy cảm đến một vị trí khác hay Yêu cầu phần mềm cài đặt cài đặt một gói phần mềm độc hạiMột ví dụ cụ thể là lỗ hổng trong GNOME Settings Daemon (CVE-2015-1345) cho phép ứng dụng bất kỳ thay đổi cài đặt màn hình khóa hoặc âm lượng thông qua D-Bus mà không cần thông qua xác thực.

=> Những cuộc tấn công này cho thấy rằng một message bus IPC cao cấp như D-Bus cần được bảo vệ bằng các policy bảo mật rõ ràng. Sự lỏng lẻo trong quá trình cấu hình sẽ khiến cho kẻ tấn công có thể dễ dàng lợi dụng để tấn công nhằm đánh cắp dữ liệu.

Bảo mật phương thức IPC trong giao tiếp UI  và service

Từ các cuộc tấn công đã đề cập ở trên ta có thể rút ra một nguyên tắc rõ ràng là không có cơ chế IPC nào là an toàn theo mặc định. Chúng ta cần phải cần phải "thiết kế" và "xây dựng" bảo mật ngay từ đầu để tránh những vấn đề không đáng có về sau. Dựa trên nguyên tắc "Zero Trust" – không tin cậy bất kỳ thành phần nào cho dù là nội bộ, tôi có rút ra được một số các chiến lược và biện pháp cụ thể để củng cố các cơ chế ipc cho ứng dụng Desktop.

nguyên tắc “Zero Trust”
Hình 7. Hình minh họa nguyên tắc “Zero Trust”
1. Các Nguyên Tắc Chung Cho Mọi Phương Thức IPC

Cho dù là phương thức IPC nào cũng cần tuân thủ những nguyên tắc nền tảng:

  • Nguyên Tắc Đặc Quyền Tối Thiểu (Principle of Least Privilege): Service/Backend chỉ nên chạy với các quyền cần thiết tối thiểu để thực hiện nhiệm vụ của nó. Tuyệt đối tránh chạy service với quyền SYSTEM hoặc root nếu không thực sự cần thiết. UI/Frontend cũng chỉ nên có quyền truy cập vừa đủ để giao tiếp với service. Nguyên tắc này sẽ giúp ứng dụng dù bị khai thác lỗ hổng thì cũng không làm được các hành vi nguy hiểm ngoài thẩm quyền.

  • Xác Thực và Ủy Quyền Mạnh Mẽ: Luôn xác thực danh tính của process đang cố gắng kết nối. Với Windows, có thể sử dụng cơ chế xác thực SSPI (Security Support Provider Interface) hoặc kiểm tra PID/SID. Trên Linux, kiểm tra UID/GID hoặc SO_PEERCRED cho Unix Domain Socket. Mục đích của nguyên tắc này là để nhằm chống bị các đối tượng không mong muốn kết nối được vào luồng.

  • Mã Hóa Dữ Liệu: Luôn coi IPC là kênh không an toàn, thực hiện mã hóa toàn bộ dữ liệu nhạy cảm trước khi truyền đi. Sử dụng các thư viện mã hóa đã được kiểm chứng (như TLS/SSL cho các kênh socket-based, hoặc áp dụng mã hóa ở tầng ứng dụng). Nguyên tắc này sẽ khiến cho việc đánh cắp dữ liệu trở nên khó khăn.

  • Kiểm Soát Truy Cập Chặt Chẽ (Access Control): Cấu hình ACL (Access Control List) nghiêm ngặt cho các đối tượng IPC như file socket, named pipe, hoặc section object. Chỉ cho phép các user hoặc group cụ thể có quyền đọc/ghi. Thực hiện ẩn các endpoint IPC bằng cách đặt tên cho các pipe, socket để nhằm gây khó khăn cho kẻ tấn công trong việc tìm kiếm và kết nối. Nguyên tắc này nhằm chống lại hành động đọc/ghi dữ liệu vào đối tượng không mong muốn.

Các cuộc tấn công được nêu ở phần trên đều thành công nhờ khai thác được các lỗ hổng trong xác thực và phân quyền (ProxyLogon khai thác lỗ hổng khi tin tưởng mọi dữ liệu được gửi qua Named Pipe xác định; PetitPotam tiến hành xác thực với một máy chủ mà không kiểm tra máy chủ này có đáng tin cậy không; tấn công qua D-Bus lợi dụng khả năng gọi tới phương thức mà không cần xác thực, phân quyền). Điều này càng khẳng định các nguyên tắc nền tảng được đề cập đóng vai trò then chốt trong việc phòng chống tấn công IPC.

2.  Biện Pháp Phòng Thủ Theo Chiều Sâu
  • Giám Sát và Kiểm Toán (Monitoring & Auditing): Sử dụng các EDR/XDR hiện đại nhằm ghi log lại tất cả các kết nối IPC bất thường, các lần truy cập bị từ chối và các hoạt động đáng ngờ. Định kỳ kiểm toán cấu hình ACL của các đối tượng IPC.

  • Hardening Môi Trường Thực Thi: 

    • Sandboxing: Chạy các thành phần UI và Service trong các sandbox (VD: Windows AppContainer, Linux namespaces/cgroups) để hạn chế thiệt hại nếu một thành phần bị xâm phạm.

    • Code Signing: Ký mã cho ứng dụng UI và Service của bạn để chống giả mạo

=> Bảo mật IPC phần không thể thiếu trong kiến trúc ứng dụng. Bằng cách áp dụng nguyên tắc đặc quyền tối thiểu, thực thi xác thực mạnh mẽ, mã hóa dữ liệu và cấu hình kiểm soát truy cập chặt chẽ, chúng ta có thể biến các kênh giao tiếp nội bộ từ "cửa hậu" nguy hiểm trở thành xương sống an toàn và vững chắc cho ứng dụng Desktop của mình.

Tài liệu tham khảo

1.      Microsoft. (2023). Interprocess Communications (Windows). MSDN Library.
 https://docs.microsoft.com/en-us/windows/win32/ipc/interprocess-communications

2.      MITRE Corporation. (2024). Common Vulnerabilities and Exposures (CVE).
 https://cve.mitre.org/ (CVE-2021-26855, CVE-2022-30216, CVE-2015-1345, v.v.)

3.      Grégory Dragic (ly4k). (2021). PetitPotam - Taking over Windows domains by coercing NTLM authentication from Windows servers.
 https://github.com/ly4k/PetitPotam

4.      Freedesktop.org. (2023). D-Bus Specification.
 https://dbus.freedesktop.org/doc/dbus-specification.html

5.      gRPC Authors. (2024). gRPC Documentation: Authentication.
 https://grpc.io/docs/guides/auth/

6.      Cherem, S. (2018). Shared Memory and IPC in Linux. University of Rochester.
 https://www.cs.rochester.edu/~scott/456/

7.      National Security Agency (NSA). (2022). Cybersecurity Information Sheet: Protecting Against Malicious Exploitation of Named Pipes and RPC.

8.      OSWAP. (2023). Desktop App Security Checklist.
 https://cheatsheetseries.owasp.org/cheatsheets/Desktop_App_Security_Cheat_Sheet.htm

4 lượt xem