- Entropy là một công cụ CLI quét các dòng có entropy cao trong các codebase quy mô lớn để tìm những chuỗi có vẻ là giá trị bí mật
- Các dòng có entropy cao được xem là đối tượng có khả năng là secret, và công cụ tập trung vào việc tìm các giá trị bí mật bị lộ trong codebase
- Việc cài đặt và chạy được cung cấp theo các cách: cài từ mã nguồn Go,
go run, Homebrew và Docker
- Có thể dùng các tùy chọn chạy
-top, -ext, -ignore-ext để chỉ định số lượng kết quả, phần mở rộng cần bao gồm và phần mở rộng cần loại trừ
- Khi chạy bằng Docker, cần mount thư mục hiện tại vào
/data và thêm /data ở cuối lệnh để quét hệ thống tệp cục bộ
Entropy làm gì
- Entropy là một công cụ CLI quét codebase để tìm các dòng có entropy cao
- Các dòng có entropy cao thường là giá trị bí mật, nên công cụ này giúp tìm rò rỉ secret trong codebase
Cách cài đặt và chạy
-
Cài bằng Go
- Cách cài đặt được khuyến nghị là cài từ mã nguồn bằng Go
- Sau khi cài, chạy bằng lệnh
entropy
go install github.com/EwenQuim/entropy@latest
entropy
- Công cụ cũng hỗ trợ cách chạy một dòng
go run github.com/EwenQuim/entropy@latest
-
Cài bằng Homebrew
- Lệnh cài đặt bằng Homebrew như sau
brew install ewenquim/repo/entropy
entropy
-
Chạy bằng Docker
- Khi chạy bằng Docker, thư mục hiện tại sẽ được mount vào
/data trong container
docker run --rm -v $(pwd):/data ewenquim/entropy /data
Ví dụ các tùy chọn chính
-h: kiểm tra các tùy chọn có sẵn
entropy -h
-top: chỉ định số lượng kết quả đầu ra hàng đầu
-ext: chỉ định phần mở rộng cần quét
entropy -top 20 -ext go,py,js
-ignore-ext: chỉ định phần mở rộng cần loại trừ
- Có thể truyền đồng thời tệp và thư mục làm đối số
entropy -top 5 -ignore-ext min.js,pdf,png,jpg,jpeg,zip,mp4,gif my-folder my-file1 my-file2
Điểm cần lưu ý khi dùng Docker
- Tùy chọn
-v của Docker được dùng để mount thư mục hiện tại vào bên trong container
/data là thư mục mặc định nơi công cụ tìm tệp
- Nếu không thêm
/data ở cuối lệnh, công cụ sẽ tìm trong container thay vì hệ thống tệp cục bộ
docker run --rm -v $(pwd):/data ewenquim/entropy -top 20 -ext go,py,js /data
docker run --rm -v $(pwd):/data ewenquim/entropy -top 5 /data/my-folder /data/my-file
1 bình luận
Ý kiến trên Hacker News
Thú vị. Nếu là tôi, có lẽ tôi sẽ làm kiểu này dựa trên nguyên lý entropy cao thì khó nén
perl -lne 'next unless $_; $z = qx(echo "$_" | gzip | wc -c); printf "%5.2f %s\n", $z/length($_), $_'Tuy nhiên cách này dùng từng dòng như một từ điển thay vì toàn bộ file, nên các dòng rất ngắn sẽ khó nén và gây ra chút vấn đề
Nó có phản ứng với những dòng như
return map { $_ > 1 ? 1 : ($_ < 0 ? 0 : $_) } @vs;; tuy là mã hợp lệ, nhưng thực sự trông cũng có entropy khá caoNgược lại, nếu thêm chú thích tiếng Anh tự nhiên thì cũng có thể đánh lừa để nó không phát hiện dòng entropy cao
Tôi đang di chuyển nên chưa xem kỹ được, nhưng so sánh lệnh Perl này với công cụ kia chắc sẽ thú vị. Ưu điểm của lệnh Perl là nó chạy ngay trên gần như mọi máy không phải Windows, nên không nhất thiết phải quá mạnh mới được chấp nhận
Vừa làm vậy vừa trêu Go và chương trình vụng về của tôi, và dù không chủ ý, hôm đó tôi cũng học được khá nhiều Ruby
Cũng có thể nối tất cả file mã nguồn lại rồi kiểm thử theo từng dòng trên toàn bộ repository, nhưng có lẽ sẽ quá chậm
xz hoặc zstd có thể là lựa chọn tốt hơn; từ góc nhìn rằng tỷ lệ nén tốt nhất chính là ước lượng entropy tốt hơn, cũng có thể xem các bài đoạt giải Hutter Prize [1]
[1] http://prize.hutter1.net/
Tất nhiên khi giải nén cũng sẽ phải cung cấp từ điển đó như một đầu vào riêng
Vấn đề này được vượt qua bằng cách đặt tất cả mật khẩu database thành
abcd"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"là dòng entropy caoMật khẩu: postgres
"correct horse battery staple"chỉ là một chuỗi từ trông bình thường nên có lẽ sẽ là entropy thấpTôi tự hỏi có bài viết hay nào bàn về cách dùng entropy cho những việc như thế này không. Từ lâu tôi đã thắc mắc mọi người thực sự dùng nó như thế nào, có hiệu quả không, nhưng chưa tự đào sâu
Trước hết, việc định nghĩa “entropy” của văn bản thế nào cũng đã mơ hồ. Ở đây chỉ đơn giản là
-Sum(x log(x)), tức khoảngx = countOccurences(char) / len(text), nhưng điều đó làm nảy sinh nhiều câu hỏi về việc nó thực sự hoạt động tốt đến đâuChuỗi phải dài bao nhiêu? Ngôn ngữ tự nhiên có entropy gần như cố định không? Có cách tiếp cận nào tốt hơn không?
Ví dụ
"vorpal"“rõ ràng” có vẻ phải có entropy thấp hơn"hJ6&:a". Chuỗi sau trông như dùng một tập ký tự lớn hơn nhiều so với ngôn ngữ tự nhiên, và dù không phải vậy thì thứ tự ký tự cũng quan trọng, nên chuỗi trước dù là từ do Carroll tạo ra vẫn nghe như một từ thậtNhưng kiểu “entropy” mà mọi người dùng hoàn toàn không biết những điều đó. Hai chuỗi này sẽ có “entropy” đúng bằng nhau
Có thể nó vẫn đủ tốt cho một công cụ tìm mật khẩu GitHub nữa, nhưng tôi tò mò liệu có thứ gì tốt hơn không. Có thước đo nào ý nghĩa hơn để đo độ ngẫu nhiên của văn bản không?
Có hàng chục dự án như vậy và ai cũng dùng “entropy” như lẽ đương nhiên, nhưng tôi chưa từng thấy nghiên cứu nghiêm túc nào về chủ đề này
Có thứ trông phức tạp trong một cách mã hóa, nhưng lại có entropy thấp trong cách mã hóa đúng
Để đánh giá chính xác entropy của một tín hiệu, cần biết cơ sở đúng hoặc suy luận từ ngữ cảnh
Để làm công cụ trong bài gốc mạnh hơn, cách tốt là chuẩn bị vài từ điển tính sẵn cho các phạm vi văn bản điển hình như mã nguồn hoặc ngôn ngữ tự nhiên, rồi dùng từng từ điển để mã hóa chuỗi và so sánh khả năng nén
Những chuỗi entropy cao như giá trị bí mật sẽ khó nén với mọi từ điển sẵn có
Lý do chúng ta có thể phân biệt dữ liệu không ngẫu nhiên với dữ liệu ngẫu nhiên là vì, trong tất cả trạng thái có thể, chỉ một tập con nhỏ được con người xem là hữu ích, và ta biết phần nào tập con đó trông như thế nào, nên có thể ước đoán một chuỗi cụ thể được tạo ra bởi quá trình nào
Tất nhiên các kiểm định thống kê như https://en.wikipedia.org/wiki/Diehard_tests đủ tốt để phân biệt dữ liệu entropy thấp và entropy cao, nhưng các bộ sinh số giả ngẫu nhiên ngày nay không gặp vấn đề gì khi vượt qua tất cả kiểm định này. Dù “entropy” thực tế chỉ nằm ở giá trị seed và độ phức tạp của thuật toán
Các công cụ đáng xem cùng:
trufflehog: https://github.com/trufflesecurity/trufflehog
detect-secrets: https://github.com/Yelp/detect-secrets
semgrep secrets: https://semgrep.dev/products/semgrep-secrets -- có tính phí, nhưng tùy trường hợp có thể đã bao gồm trong giấy phép hiện có
Tôi cho rằng những giải pháp này tốt hơn nhiều trong việc tìm giá trị bí mật so với cách tiếp cận đơn giản dựa trên entropy
Đúng là entropy mang tính tổng quát hơn, nhưng các công cụ này đã rất ổn định và đã được kiểm chứng qua rất nhiều dataset
Vài năm trước, nhờ DrJones đã hỏi chuỗi entropy cao là gì[0] và liên kết tới một bài viết hay liên quan[1], nên tôi đã được giúp ích
[0] https://news.ycombinator.com/item?id=13304641
[1] https://www.splunk.com/en_us/blog/security/random-words-on-e...
Tôi nhớ đến chương trình ent đã dùng từ lâu
https://fourmilab.ch/random/
Có lẽ sẽ hữu ích nếu công cụ này quét cả toàn bộ lịch sử git của dự án. Ngay cả khi giá trị bí mật đã được commit rồi sau đó bị xóa, nó vẫn có thể còn nằm trong lịch sử
Tôi không hiểu vì sao phải cài Go để chạy công cụ này. Chẳng phải một trong những ưu điểm của Go là nhà phát triển có thể phân phối một binary đơn lẻ chạy được ngay sao?
Tôi cũng dự định tạo Docker image
Thành thật mà nói, tôi không nghĩ nó sẽ trở nên phổ biến như vậy nên repository vẫn chưa ở trạng thái sẵn sàng 100%
Các mô hình ngôn ngữ như Llama 3 có vẻ có thể mô hình hóa mức độ bất ngờ theo từng token để phát hiện những vùng gây bất ngờ nhất, tức là những vùng có entropy cao nhất
Như một trong các ví dụ, toàn bộ bảng chữ cái có thể có entropy cao theo một góc nhìn nào đó, nhưng với một mô hình ngôn ngữ quen thuộc với code, việc có bảng chữ cái Base62 làm hằng số trong codebase sẽ không hề đáng ngạc nhiên