2 điểm bởi GN⁺ 2024-06-06 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

 
GN⁺ 2024-06-06
Ý 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á cao
    Ngượ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

    • Lâu trước tôi học Go khi giải Advent of Code; mỗi lần giải xong, bạn cùng nhà cứ nằng nặc đòi xem mã, rồi viết lại lời giải dài 10~50 dòng bằng Go thành một dòng Ruby
      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
    • Nếu đo kích thước file bằng mọi dòng trong file trừ dòng đang kiểm thử, rồi thêm dòng đó vào và đo lại, chênh lệch kích thước có thể là một chỉ số công bằng hơn
      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
    • Tôi sẽ dùng một trình nén tốt hơn gzip, nhưng đã dùng mẹo này nhiều lần
      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ôi tự hỏi trong các công cụ dòng lệnh như zip có công cụ nào cho phép định nghĩa sẵn từ điển bằng một hoặc nhiều file, rồi dùng từ điển đó để nén file nhỏ không
      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
    • Tôi đang dùng secret scanner của Yelp làm pre-commit hook, và có thể thiết lập khá dễ bằng cơ chế cài đặt của pre-commit
  • Vấn đề này được vượt qua bằng cách đặt tất cả mật khẩu database thành abcd

    • Trong codebase của chúng tôi, công cụ này phát hiện "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"dòng entropy cao
    • Tên người dùng: postgres
      Mật khẩu: postgres
    • Làm tôi nhớ đến https://xkcd.com/936/. "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ấp
  • Tô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ảng x = 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 đâu
    Chuỗ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ật
    Như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

    • Entropy là thước đo độ phức tạp hoặc mức độ hỗn loạn của tín hiệu. Điểm thú vị là sự hỗn loạn đó tương đối so với một cơ sở hoặc từ điển phù hợp
      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ó
    • Entropy của một chuỗi cụ thể không phải là một khái niệm toán học nghiêm ngặt. Theo định nghĩa, một chuỗi đã biết chỉ có thể có một giá trị, nên “entropy” sẽ là 0 bit
      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
    • Độ phức tạp Kolmogorov của một chuỗi tùy ý là không thể tính được
  • 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ó

    • PyWhat cũng đáng xem để tìm các chuỗi thú vị và giá trị bí mật: https://github.com/bee-san/pyWhat
    • noseyparker cũng khá ổn: https://github.com/praetorian-inc/noseyparker
      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?

    • Vì là công cụ bảo mật, nếu tin ngay binary từ đầu thì lại đi ngược mục đích. Có source thì ít nhất vẫn có lựa chọn kiểm tra xem nó thực sự làm gì
    • Tôi đã muốn đưa lên Homebrew nhưng PR bị từ chối, nên có lẽ phải tự tạo brew tap hoặc thuyết phục họ chấp nhận
      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%
    • Docker container hiện đã có thể dùng và đã được tài liệu hóa trên trang chủ
  • 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