Ngày 20/8, nhà phát triển phần mềm Xusheng Li của Vector 35 công bố một bản phân tích ngược, kết luận rằng Paint và Photos đi kèm Windows, khi tạo ảnh bằng AI, sẽ mã hóa một chuỗi GUID 16 byte lấy từ máy chủ Microsoft vào các pixel, tạo thành một watermark mà mắt thường không thấy được. Đến ngày 25/8, The Register đưa tin tiếp theo, sự việc mới lan rộng trong giới lập trình viên.
Theo phân tích của Li, quy trình bắt đầu ngay từ khoảnh khắc prompt rời khỏi máy của người dùng. Người dùng gõ mô tả vào Cocreator trong Paint, chương trình gửi prompt đó tới một điểm cuối Azure Front Door của Microsoft để kiểm duyệt, phía máy chủ trả về ba thứ: một prompt đã được chỉnh sửa, một promptGenerationId, và một giá trị gọi là watermarkId. watermarkId chính là GUID sau này được ghi vào pixel.
Watermark được nhúng vào ảnh như thế nào
Thành phần phụ trách mã hóa có tên Watermarker.dll, dung lượng 1,67 MB, đi kèm một tệp mô hình đã mã hóa nặng 302,4 MB tên mager.onnxe. GUID 16 byte được thêm một cờ đánh dấu 0x4c ở đầu, một checksum ở cuối, gộp lại thành 18 byte, trải ra thành 144 bit. Mỗi bit cần tối thiểu một khối pixel 8×8 để mang thông tin, nên ảnh muốn gắn được watermark phải có kích thước tối thiểu 192×192.
Cái giá phải trả không hề nhỏ. Li thống kê trên một ảnh 512×512: trong tổng số 262.000 pixel có tới 193.000 pixel bị thay đổi, tương đương khoảng 74%. Cách thay đổi dùng thuật toán kiểu SVD theo khối, thích ứng theo nội dung ảnh, mắt thường không nhận ra, nhưng thực chất đã viết lại hơn nửa bức ảnh.
Cùng một GUID đó còn được ghi vào metadata C2PA Content Credentials dưới dạng soft-binding, với mã thuật toán là com.microsoft.invismark.1, do Microsoft ký. Một bản nằm trong pixel, một bản nằm trong metadata, hai đường này làm bản sao lưu cho nhau — nếu gỡ bỏ metadata C2PA, watermark trong pixel vẫn còn nguyên.
Các định dạng được hỗ trợ gồm PNG, JPEG, GIF và định dạng .paint riêng của Paint. BMP không nằm trong danh sách này, theo Li là vì BMP không lưu được đầy đủ manifest C2PA.
Hai ứng dụng, hai cách xử lý khác nhau
Paint và Photos xử lý khác nhau khi việc gắn watermark thất bại, và sự khác biệt này tiết lộ khá nhiều điều:
- Paint: nếu không gắn được watermark, cả lần tạo ảnh đó coi như thất bại, ảnh sẽ không được trả về cho người dùng.
- Photos: chỉ ghi một dòng log lỗi, rồi vẫn trả ảnh không có watermark cho người dùng như bình thường.
Image Creator và Restyle Image trong Photos dùng chung một Watermarker.dll. Cách làm "thà không ra ảnh còn hơn ra ảnh không watermark" của Paint cho thấy, trong logic sản phẩm của Microsoft, watermark là một bước bắt buộc của quy trình tạo ảnh, không phải một tùy chọn thêm vào sau.
Li còn phát hiện một chi tiết: Paint sẽ lấy promptGenerationId của lần tạo ảnh trước, gửi kèm dưới tên lastPromptGenerationId trong yêu cầu kiểm duyệt của lần tiếp theo. Nhờ vậy, phía máy chủ nối các lần tạo ảnh liên tiếp thành một chuỗi rõ ràng.
Chuyện kết nối mạng
Điểm dễ bị hiểu lầm nhất nằm ở các máy Copilot+ PC. Dòng máy này có NPU cục bộ, việc tạo ảnh thực sự chạy ngay trên máy, và Microsoft cũng luôn lấy "tạo ảnh cục bộ" làm điểm bán hàng. Nhưng cả hai bước kiểm duyệt prompt và ký xác nhận nguồn gốc đều diễn ra trên mây — GUID phải xin từ máy chủ, chữ ký C2PA phải do Microsoft ký. Ảnh được vẽ tại chỗ, nhưng "giấy thông hành" phải xin qua mạng.
Về mặt riêng tư, suy luận không có gì phức tạp: chỉ cần Microsoft khớp được từng prompt với tài khoản đã gửi nó, thì về lý thuyết, có được một ảnh bị rò rỉ, tra ngược watermark là xác định được ai đã tạo và tạo vào lúc nào. Lời phê bình của Li không nhắm vào bản thân công nghệ watermark, mà nhắm vào mức độ công khai chưa đầy đủ — Microsoft từng công khai nói về các biện pháp an toàn AI của mình, nhưng chưa từng nói rõ rằng GUID trong manifest C2PA có gắn với prompt của người dùng hay không. The Register đã liên hệ Microsoft để xin bình luận, nhưng tới hạn đăng bài vẫn chưa nhận được phản hồi.
Ranh giới giữa truy xuất nguồn gốc và theo dõi
Yêu cầu về minh bạch đối với nội dung do AI tạo ra của EU tập trung vào việc "cho người dùng biết đây là nội dung do AI tạo ra". Các chuẩn như C2PA cũng được thiết kế ra để làm việc đó, tức đánh dấu nguồn gốc và cách thức tạo ra nội dung. Cách làm của Microsoft đi xa hơn việc đánh dấu một bước: nó cấp cho mỗi lần tạo ảnh một mã số riêng biệt.
Cách triển khai kỹ thuật của hai việc này gần như giống hệt nhau, nhưng mục đích lại khác xa nhau. Tính nhẩm thì để phân biệt thông tin nhị phân kiểu "do AI tạo ra hay không", chỉ cần 1 bit là đủ; trong khi GUID 16 byte có tới 2^128 giá trị khả dĩ, phần bit dư ra chỉ có thể dùng để mã hóa những thứ chi tiết hơn nhiều. Chính độ dài bit đó đã nói lên ý đồ thiết kế — đây không phải một nhãn nội dung, mà là một tấm căn cước cho từng sự kiện tạo ảnh.
Với người dùng Windows thông thường, ảnh hưởng trước mắt không lớn, phần lớn mọi người sẽ không dùng ảnh tạo từ Paint cho việc gì cần ẩn danh. Nhưng với những ai coi Paint là công cụ dùng tiện tay, có một điều giờ đã chắc chắn: tạo ảnh cục bộ không có nghĩa là không để lại dấu vết cục bộ, mỗi bức ảnh đều mang theo một mã số mà chỉ Microsoft mới giải thích được.
Nguồn tham khảo: báo cáo phân tích ngược được Xusheng Li công bố, The Register, CocoLoop; đã kiểm chứng độ dài byte của GUID, số bit của watermark, số pixel bị thay đổi trên ảnh 512×512 và cách viết mã thuật toán C2PA.