Cách sử dụng các tính năng Discord Nitro miễn phí
(archive.md)- Discord, một ứng dụng desktop dựa trên Electron, hoạt động nội bộ như một cửa sổ Chromium nên có thể mở công cụ dành cho nhà phát triển web; nhờ đó có thể chỉnh sửa mã phía client
- Một số client mod và plugin mở khóa ở phía client một phần các tính năng vốn cần gói đăng ký trả phí Nitro
- Cốt lõi là cách chèn vào biến
webpackChunkdiscord_appcác module được chia tách bằng code splitting của Webpack để dò tìm và thay thế các hàm nội bộ - Hàm kiểm tra chất lượng chia sẻ màn hình chỉ được xác thực ở phía client nên có thể bị vượt qua, nhưng theme cao cấp còn có thêm cơ chế xác thực đồng bộ hóa phía máy chủ
- Tất cả kỹ thuật demo đều vi phạm Điều khoản sử dụng của Discord, có nguy cơ bị khóa tài khoản và nguy cơ bị chiếm đoạt tài khoản do chạy mã chưa được kiểm chứng
Tổng quan
- Có nhiều client Discord mod thay đổi giao diện hoặc bổ sung tính năng, và một số plugin còn mở khóa cả những tính năng cần gói đăng ký trả phí Nitro
- Giải thích nguyên lý kỹ thuật khiến các hành vi này khả thi thông qua phân tích cấu trúc client
Kích hoạt công cụ dành cho nhà phát triển
- Discord được phát triển bằng framework Electron để tạo ứng dụng đa nền tảng bằng công nghệ web, nên tương tự một website chạy trong trình duyệt web
- Về bản chất đây là một cửa sổ Chromium, nên có thể mở công cụ dành cho nhà phát triển, nhưng mặc định đang bị vô hiệu hóa
- Tính năng này bị chặn vì đã có nhiều trường hợp người dùng bị tác nhân đe dọa dụ dỗ bằng kỹ thuật xã hội để dán lệnh độc hại, dẫn đến bị chiếm đoạt tài khoản
- Nếu hiểu rõ rủi ro, có thể kích hoạt bằng cách thêm giá trị
DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOINGlàtruevào tệp cấu hình%appdata%/discord/settings.json- Sau đó mở console dành cho nhà phát triển bằng
ctrl + shift + i
- Sau đó mở console dành cho nhà phát triển bằng
Patch hàm của Discord
- Để tối ưu hóa tải ban đầu, mã được chia thành nhiều chunk và được tải song song hoặc tải trì hoãn (lazy-loaded), sử dụng tính năng code splitting của Webpack
- Tất cả chunk đã tải được lưu trong biến
webpackChunkdiscord_app - Muốn chạy mã sử dụng các biến/hàm của Discord thì cần chèn (inject) mã vào biến này
a.clà đối tượng chứa toàn bộ module, mỗi module có dạngchunk_id,loaded,exportsexportschứa các hàm, đối tượng và giá trị nguyên thủy được module xuất ra
- Có thể tạo hàm
findđể duyệt qua nhiều module JavaScript, từ đó tìm kiếm và gọi một hàm cụ thể- Ví dụ: tìm và gọi hàm
getCurrentUser()
- Ví dụ: tìm và gọi hàm
- Có thể thay thế (replace) hàm gốc bằng hàm khác để thay đổi hành vi, nên có thể chỉnh sửa mã trực tiếp
Mở khóa streaming chất lượng cao
- Nội dung từ thời điểm này trở đi rõ ràng vi phạm Điều khoản sử dụng của Discord và có thể dẫn đến khóa tài khoản, nên phải tự chấp nhận rủi ro
- Hai hàm kiểm tra cấp đăng ký của người dùng là
canStreamMidQualityvàcanStreamHighQualityđược gọi ngay trước màn hình chọn chất lượng chia sẻ màn hình- Nếu ép giá trị trả về của hai hàm này thành
true, người không đăng ký Nitro cũng có thể chọn chia sẻ màn hình ở độ phân giải gốc 60 FPS
- Nếu ép giá trị trả về của hai hàm này thành
- Hiện tại, có vẻ Discord không xác thực ở phía máy chủ xem stream được truyền có thực sự tuân thủ giới hạn dành cho người không đăng ký hay không
- Tuy nhiên Discord hiện vẫn chưa dùng mã hóa đầu cuối (End-to-End encryption), nên vẫn có khả năng bị phát hiện
- Theo bài tham khảo, Discord đã kiểm tra nội dung âm thanh/video của người dùng và trong tương lai có thể bổ sung xác thực phía máy chủ trước khi chia sẻ màn hình
Mở khóa theme cao cấp
- Nếu đổi giá trị của hàm
canUseClientThemes, hàm trả về việc người dùng có thể dùng theme Nitro hay không, thànhtrue, nút chọn theme cao cấp sẽ được mở khóa - Tuy nhiên theme chỉ được áp dụng trong chốc lát rồi ngay lập tức quay về theme mặc định
- Lý do là client cố lưu thay đổi theme nhưng máy chủ xác thực rằng không có quyền, và khi nhận phản hồi thì áp dụng lại theme mặc định
- Nếu patch hàm
shouldSyncđể chỉ chặn đồng bộ hóa thiết lập giao diện, khiến hàm trả vềfalsekhi giá trị làappearance, thì thay đổi theme sẽ được giữ lại - Theme được quản lý hoàn toàn ở phía client và việc chỉnh sửa trực tiếp CSS luôn khả thi, nên Discord khó có thể ngăn chặn điều này
Kết luận
- Có mã giúp áp dụng dễ dàng các hack đã được trình diễn, nhưng điều quan trọng là phải thận trọng trước khi sửa client hoặc dùng mod
- Discord có thể khóa tài khoản vi phạm điều khoản sử dụng bất cứ lúc nào, và việc chạy mã chưa được kiểm chứng có quyền truy cập tài khoản là cực kỳ nguy hiểm
- Thông điệp được mã hóa trong bài viết: "Đừng dán mã mà bạn không hiểu vào console dành cho nhà phát triển — đó là cách dễ nhất để bị chiếm đoạt tài khoản"
1 bình luận
Ý kiến trên Hacker News
Nếu chỉ cần chạy một blob được mã hóa base64 đơn giản gắn ở cuối là bật được mọi tính năng, thì tôi nghĩ đó có thể là một vector tấn công khá dễ
Không phải tôi nghi ngờ tác giả đâu; vừa giải mã thử thì đúng là bị chơi một vố
base64 --decode, kết quả là thế này:// Here's a cake if you thought about inspecting the code before executing it:let css = 'font-size: 36px; font-weight: bold; color: red';console.log("%cNEVER paste code you don't understand into the development console.", css);console.log("%cThis is the best way to compromise your account.", css);“Hiện tại Discord có vẻ không xác minh ở phía máy chủ rằng luồng stream đang được truyền có thật sự tuân thủ tiêu chuẩn dành cho người không đăng ký hay không”, nghe vậy tôi tò mò không biết ai lại nghĩ đây là cách triển khai tốt
Xác minh phía client trông đúng là một lỗi rất sơ đẳng
Tôi dùng Discord đã vài năm và đây là lần đầu nghe đến việc cố vượt qua cấu trúc quyền truy cập của Nitro; nếu chuyện này không phổ biến thì có vẻ cũng chẳng có lý do gì phải bận tâm
Nhân tiện, chỉ trong tháng này tôi đã bắt đầu công việc mới thứ năm, và có vẻ tôi thật sự không hợp với các quản lý dự án
Tôi tự hỏi có bao nhiêu người vừa hiểu được kiểu hack này lại vừa sẵn sàng trả tiền cho Nitro. Có lẽ có hàng nghìn, thậm chí hàng chục nghìn người dùng các bản mod client Discord để bật một phần hoặc toàn bộ tính năng Nitro, nhưng tôi nghi ngờ việc chặn chuyện này sẽ thật sự tạo ra bao nhiêu doanh thu
Cá nhân tôi nếu cần hoặc muốn các tính năng đó thì trả 10 đô la mỗi tháng đỡ phiền hơn nhiều. Như vậy tốt hơn là cứ phải chạy theo các bản mod sẽ hỏng sau mỗi lần Discord cập nhật, rồi hy vọng maintainer không cài mã độc vào
Kênh chỉ bị ẩn ở phía client. Nói rõ hơn, dù vậy bạn vẫn không xem được nội dung tin nhắn trong kênh đó
Máy chủ thoại chỉ hỏi API xem bạn có quyền tham gia hay không, rồi sau đó hoạt động như một bộ phát gói một-nhiều
Đây gần với kiểu hacker cổ điển theo nghĩa tò mò và thành thạo
Không có thiệt hại nghiêm trọng, và nó nhắc lại rằng ứng dụng không phải phép màu, còn code thì rất thú vị
Vì như vậy họ mới có thể cố vắt thêm tiền từ chúng ta mà không gặp phản kháng
Nhắc lại lần nữa: mọi thứ bạn gửi qua Discord, bao gồm cả DM, đều được ghi lại dưới dạng văn bản thuần tại Discord và Discord cũng như thực thể mua lại công ty đó có thể truy cập
Có lúc tưởng như Microsoft sẽ mua lại, còn hiện giờ có vẻ đang hướng tới IPO
Chỉ riêng việc có tài khoản cũng bình thường hóa các cuộc trò chuyện cá nhân dễ bị khai thác dữ liệu cho AI, hoặc bị Discord cùng các quản trị viên cơ sở dữ liệu/hệ thống sử dụng. Section 702 của FISA Amendments Act (FAA702) cho phép các cơ quan điều tra liên bang truy cập loại dữ liệu đó mà không cần lệnh tòa
Chỉ riêng khả năng front-running tiền mã hóa thôi có lẽ đã đáng hàng chục triệu đô la mỗi ngày
Nếu là bạn bè, đừng khuyên bạn mình dùng hệ thống chat không mã hóa đầu cuối. Đừng làm mật ngọt trong bẫy
Trừ khi bạn dùng một trong số ít dịch vụ triển khai mô hình zero trust thật sự, nơi người dùng tự quản lý khóa, thì đó là chuyện hiển nhiên. Lý do lưu tin nhắn là để người dùng có thể truy cập lại
Cũng có những dịch vụ làm được nhắn tin nhóm mã hóa đầu cuối theo cách tương đối thân thiện như Matrix, nhưng đó gần như là ngoại lệ. Việc Discord làm giống cách 95% nền tảng truyền thông điện tử vẫn làm không có nghĩa là công bằng khi quy riêng Discord là đặc biệt độc hại
Không phải tôi nói vậy là tốt, nhưng trong một số cộng đồng, ngoài việc không tham gia thì chẳng còn lựa chọn nào
Nó còn tệ hơn thời “ai cũng dùng WhatsApp” trước đây. Khi đó bạn có số điện thoại của đối phương nên dễ liên hệ theo cách khác, còn sức hút của Discord không nằm ở trò chuyện cá nhân mà ở các cộng đồng có không gian bán công khai. Ở đây công khai không có nghĩa là mở cho tất cả, mà gần với việc có khoảng 100 người đọc
Khi xóa tin nhắn, nó không còn được lưu trong cơ sở dữ liệu nữa
Gần đây OpenAI đột ngột vô hiệu hóa Discord dành cho beta tester, khiến chúng tôi không còn xem được mình đã thảo luận gì với ai
Tôi đã tự hỏi liệu có cách xuất chat ra mà không để quản trị viên máy chủ có cơ hội lục lại lịch sử và không khiến cộng đồng bị cắt rời khỏi nhau hay không
Có khá nhiều extension Chrome để xuất chat Discord, nhưng hầu hết dường như khóa một số tính năng sau trả phí
Hóa ra rất dễ sao chép mã nguồn extension từ thư mục Chrome, sửa các kiểm tra boolean kiểu
is_protrong JavaScript, rồi tải lại dưới dạng extension đã giải nénĐây là một chương trình độc lập dùng API theo cách không chuẩn, nhưng tôi chưa thấy ai bị chặn vì dùng nó
Bài có cảnh báo đúng rằng dùng các thủ thuật này có thể bị cấm, nhưng Discord từng có tiền lệ cấm người dùng vì việc như vậy chưa?
Họ cũng chặn việc dùng client thay thế. Nếu tài khoản quan trọng với bạn, tốt nhất đừng động chạm Discord
“Việc chỉnh sửa client vi phạm Điều khoản Dịch vụ của Discord.”
Tuy nhiên Discord khá thờ ơ với chuyện này, và chưa có trường hợp nào được biết đến bị cấm chỉ vì dùng client mod. Vì vậy nếu bạn không dùng plugin triển khai hành vi lạm dụng thì nhìn chung sẽ ổn. Không cần lo, vì các plugin tích hợp sẵn được nói là đều an toàn
Tôi hiểu việc một số theme được bật theo cách này, nhưng để chất lượng stream được quyết định bằng kiểm tra phía client thay vì phía máy chủ thì khá khó hiểu
Không cần truy cập video thực tế; ngay cả khi được mã hóa hoàn toàn, nhìn vào lượng dữ liệu truyền đi cũng biết đang stream ở chất lượng nào
Nguyên tắc lớn của kỹ thuật frontend lại một lần nữa đúng
“Tuyệt đối, tuyệt đối không bao giờ tin client”
Từ khi thấy việc này có thể xử lý hoàn toàn phía client, tôi vẫn bật developer tools và nút stream 1080p60 để dùng, và nó thật sự hoạt động
Không biết đã mấy năm rồi, nhưng phía Discord có vẻ chẳng ai bận tâm
Trước đây tôi từng định đi theo hướng này, nhưng rốt cuộc bỏ cuộc vì không tìm được cách vá client một cách ổn định, nhất là sau các bản cập nhật
Nhưng nhìn cách này lại khiến tôi nảy sinh ham muốn “mổ ra chọc thử” lần nữa
Có cách đơn giản nào để rà qua các API có thể dùng theo kiểu này không? Tôi từng thử log tất cả nhưng quá hỗn loạn vì map, quốc tế hóa, v.v. Không biết có ai đã chịu khó làm kiểu tài liệu reverse engineering nào chưa