Restore website sau malware không đơn giản là chọn bản backup gần nhất rồi ghi đè production. Nếu restore point đã chứa backdoor, cron độc hại, user trái phép, plugin bị tamper hoặc cấu hình persistence, quá trình phục hồi có thể đưa chính mã độc trở lại website.
Mục tiêu đúng là tìm một known-good restore point, phục hồi trong môi trường kiểm soát, xử lý entry point và credential, xác minh integrity rồi mới đưa traffic trở lại. Nếu bạn còn đang phân vân nên restore hay cleanup trực tiếp, xem Restore backup hay cleanup malware WordPress trước.
Vì sao backup gần nhất chưa chắc là backup an toàn?
Malware có thể tồn tại một thời gian trước khi được phát hiện. Trong khoảng đó, backup job vẫn chạy bình thường và sao chép cả file, database hoặc persistence đã bị compromise. Vì vậy “backup mới nhất” chỉ cho biết thời điểm gần nhất, không chứng minh restore point sạch.
CISA khuyến nghị bảo vệ backup, giữ chúng offline khi phù hợp và bảo đảm backup dùng để recovery không chứa malware. WordPress cũng nhấn mạnh trusted backup và integrity của dữ liệu backup.
Phase 1 — Xác định known-good restore point
Bước 1: khóa timeline của compromise
Trước khi chọn restore point, xác định khoảng thời gian nghi ngờ compromise bắt đầu. Dùng evidence như Admin không xác định, file PHP thay đổi bất thường, plugin có lỗ hổng dẫn tới xâm nhập, hoặc redirect/JavaScript injection/SEO spam. Timeline càng rõ, bạn càng có cơ sở loại những restore point được tạo sau initial compromise.
Bước 2: không phá evidence trước khi recovery
Đừng vội xóa toàn bộ file nghi ngờ hoặc reset mọi thứ nếu incident vẫn cần investigation. Giữ snapshot, log, artefact và metadata cần thiết trước khi thay đổi production. Điều này giúp xác định entry point, persistence và blast radius.
Nếu cần quy trình bảo toàn evidence, xem cách bảo toàn evidence khi website bị hack.
Bước 3: chọn candidate restore point
Chọn một hoặc nhiều restore point trước thời điểm compromise nghi ngờ và đánh giá:
| Tiêu chí | Câu hỏi cần trả lời |
|---|---|
| Thời điểm | Backup có trước dấu hiệu compromise sớm nhất không? |
| Integrity | Archive/database có đọc, giải nén và import được không? |
| Scope | Có đủ database, files, uploads và custom component cần thiết không? |
| Compatibility | Version code/database có thể khôi phục cùng nhau không? |
| Security | Có dấu hiệu persistence, user lạ, tampering hay secret exposure không? |
Bài kiểm tra backup có thực sự restore được không cung cấp restore-test gate cho candidate backup.
Phase 2 — Restore và loại persistence
Bước 4: restore trong môi trường cô lập trước
Không nên đưa candidate backup thẳng lên production nếu chưa kiểm chứng. Restore vào staging/sandbox tách biệt, chặn outbound side effect cần thiết và dùng test credential khi có thể.
Trong môi trường này, bạn có thể kiểm tra file, database, user, cron, plugin/theme và application behavior mà không mở lại đường truy cập cho attacker hoặc gây tác động tới khách hàng.
Bước 5: kiểm tra persistence trước khi go-live
Đặc biệt kiểm tra các vị trí mà malware có thể duy trì quyền truy cập: Admin/plugin/MU-plugin persistence, PHP backdoor trong wp-config.php/.htaccess/index.php và WP-Cron/database persistence gây tái nhiễm. Không kết luận sạch chỉ vì antivirus không báo hoặc homepage hiển thị bình thường.
Bước 6: xử lý entry point trước hoặc cùng lúc với recovery
Nếu lỗ hổng ban đầu vẫn tồn tại, restore site sạch chỉ tạo một mục tiêu sạch để attacker xâm nhập lại. Tùy root cause, remediation có thể gồm cập nhật hoặc loại component vulnerable, đóng account/credential bị compromise, sửa permission/exposure sai, thay secret/API key hoặc fix web server, hosting, WAF và configuration gap.
Restore không thay thế root-cause remediation.
Bước 7: rotate credential có kiểm soát
Credential có thể đã bị lấy cắp trước thời điểm backup. Vì vậy restore database cũ không đồng nghĩa credential trở lại an toàn. Inventory WordPress Admin, hosting panel, SSH/SFTP, database, API key, SMTP, CDN/WAF và các secret liên quan.
Thực hiện rotation theo scope và sequence phù hợp để tránh làm hỏng recovery. Xem Credential Rotation sau website compromise.
Phase 3 — Reconcile, verify và go-live
Bước 8: quyết định dữ liệu mới sau restore point
Known-good backup càng cũ thì nguy cơ mất dữ liệu mới càng cao. Đơn hàng, form, content, user hoặc media phát sinh sau restore point cần được đánh giá riêng.
Không nên copy nguyên database mới vào site đã restore nếu database đó có thể chứa payload. Có thể cần selective export/import hoặc replay dữ liệu đã kiểm chứng, tùy application và dependency.
Để chọn full hay partial scope, xem Full Restore vs Partial Restore.
Bước 9: thực hiện restore theo procedure có rollback
Sau khi candidate backup PASS và scope được chốt, thực thi theo quy trình Website Restore từ Backup: snapshot pre-restore, restore database/files đúng scope, xử lý config/secret, smoke test và đo RPO/RTO.
Luôn giữ rollback path nếu restore gây compatibility issue hoặc phát hiện thêm dấu hiệu compromise. Trước các thay đổi hardening/reconfiguration ở production, có thể dùng Website Hardening Checklist trước khi triển khai thay đổi để khóa dependency, backup, rollback và validation.
Bước 10: xác minh site sạch trước khi mở traffic
Trước go-live, kiểm tra ít nhất:
- Không còn indicator/persistence đã biết.
- File integrity và component inventory hợp lý.
- Admin/account đã được review.
- Credential/secret cần thiết đã rotate.
- Business flow critical PASS.
- Logging/monitoring hoạt động.
- Không có redirect, spam, backdoor hoặc cron bất thường tái xuất hiện.
Quy trình chuyên sâu nằm ở xác minh WordPress đã sạch malware sau cleanup. Một case end-to-end về việc đi từ cleanup tới restore, verification và bàn giao là Cleanup, Restore, Verification và Bàn giao Website sau Malware. Với recovery ở phạm vi security incident rộng hơn, xem case khôi phục Website sau Security Incident mà không tái nhiễm.
Bước 11: tăng monitoring sau recovery
Giai đoạn sau restore cần theo dõi dày hơn baseline bình thường. Ưu tiên auth event, file change, plugin/theme change, cron/persistence signal, WAF event và các IOC từ incident.
Nếu signal cũ tái xuất hiện, đừng tiếp tục “cleanup lặp lại”; mở lại Incident Response và đánh giá root cause/persistence.
Restore-after-malware Decision Record
incident_id: <id>
initial_compromise_window: <time range>
candidate_restore_point: <id/timestamp>
backup_integrity: PASS|FAIL
known_good_assessment: PASS|FAIL|UNCERTAIN
persistence_checks: <evidence refs>
entry_point_status: fixed|contained|unknown
credential_rotation: PASS|PARTIAL|NOT_REQUIRED
new_data_reconciliation: <method>
restore_scope: full|database|files|selective
smoke_test: PASS|FAIL
security_verification: PASS|FAIL
monitoring_window: <duration/owner>
final_decision: go-live|hold|rollback
Quality gate: khi nào không được go-live?
- Restore point chưa được xác minh integrity.
- Entry point hoặc persistence vẫn chưa rõ trong incident có risk cao.
- Credential compromise chưa được xử lý.
- Business flow critical chưa PASS.
- Logging/monitoring chưa hoạt động.
- IOC hoặc behavior đáng ngờ tái xuất hiện sau restore.
Nguồn kỹ thuật
- CISA StopRansomware Guide.
- WordPress Developer — Backups.
- WordPress Developer — Hardening WordPress.
Kết luận
Restore website sau malware chỉ an toàn khi restore point được đánh giá là known-good, entry point và credential được xử lý, persistence được kiểm tra và site được verify trước go-live. Restore nhanh nhưng khôi phục lại mã độc không phải recovery; đó chỉ là tái tạo trạng thái compromise.
