Steganography by files: ẩn dữ liệu trực tiếp trong các lĩnh vực

Một lời nói đầu nhỏ

Steganography nếu ai không nhớ thì đang giấu thông tin trong một số thùng chứa. Ví dụ, trong hình ảnh (thảo luận đây и đây). Bạn cũng có thể ẩn dữ liệu trong các bảng dịch vụ của hệ thống tệp (điều này được viết về đây), và ngay cả trong các gói dịch vụ giao thức TCP. Thật không may, tất cả các phương pháp này đều có một nhược điểm: để "chèn" thông tin vào vùng chứa một cách dễ dàng, bạn cần các thuật toán tinh vi có tính đến đặc thù của cấu trúc bên trong của vùng chứa. Và các vấn đề nảy sinh với khả năng chống thao túng của vùng chứa: ví dụ: nếu bạn chỉnh sửa hình ảnh một chút, thông tin ẩn sẽ bị mất.

Có thể bằng cách nào đó thực hiện mà không cần các thuật toán phức tạp và các thao tác tinh vi với dữ liệu mà vẫn đảm bảo chức năng của vùng chứa và mức độ bảo mật có thể chấp nhận được của dữ liệu ẩn? Nhìn về phía trước, tôi sẽ nói - vâng, bạn có thể! Tôi thậm chí sẽ cung cấp một tiện ích.

Chi tiết đẫm máu của phương pháp

Ý tưởng cơ bản đơn giản như một cú đánh vào trán: có những vùng trên đĩa mà hệ điều hành không bao giờ ghi vào (hoặc ghi trong một số trường hợp hiếm hoi). Để tránh phải tìm kiếm những khu vực này bằng các thuật toán xảo quyệt, chúng tôi sẽ sử dụng tính năng dự phòng - nghĩa là chúng tôi sẽ sao chép thông tin ẩn của mình rất nhiều lần trên tất cả các khu vực của đĩa. Sau đó, trên hết sự huy hoàng này, bạn có thể tạo các phân vùng cần thiết, định dạng hệ thống tệp, ghi tệp và cài đặt hệ điều hành - tất cả đều giống nhau, một phần dữ liệu bí mật sẽ được lưu và có thể truy xuất được, đồng thời việc sao chép nhiều lần sẽ giúp chúng ta ghép toàn bộ ban đầu lại với nhau từ các mảnh.

Ưu điểm của phương pháp này là rõ ràng: chúng tôi không phụ thuộc vào định dạng tệp hoặc thậm chí vào loại hệ thống tệp được sử dụng.

Tôi nghĩ những nhược điểm cũng là hiển nhiên:

  • Dữ liệu bí mật chỉ có thể được thay đổi bằng cách ghi lại hoàn toàn toàn bộ đĩa, sau đó là tạo lại nội dung hiển thị cho người dùng. Tuy nhiên, bạn không thể sử dụng phần mềm tạo lại đĩa từ hình ảnh: phần mềm này cũng sẽ tạo lại dữ liệu bí mật trước đó.
  • Khối lượng dữ liệu bí mật càng lớn thì khả năng mất một số thông tin càng lớn.
  • Việc lấy dữ liệu từ đĩa có thể mất nhiều thời gian. Từ vài phút đến vài ngày (đĩa hiện đại có dung lượng lớn).

Bây giờ chúng ta hãy chuyển sang chi tiết cụ thể.

Rõ ràng là nếu bạn chỉ bôi dữ liệu bí mật ra khắp đĩa thì nó sẽ chỉ bị ẩn khỏi mắt thường. Ví dụ: nếu bạn trang bị cho cái nhìn của mình một trình soạn thảo đĩa, dữ liệu sẽ xuất hiện một cách hoàn hảo. Vì vậy, tốt nhất bạn nên mã hóa dữ liệu để nó không hiển thị. Chúng tôi sẽ mã hóa một cách đơn giản nhưng trang nhã: sử dụng thuật toán aes256-cbc. Chúng tôi sẽ yêu cầu người dùng cung cấp khóa mã hóa và để anh ta nghĩ ra một mật khẩu tốt.

Câu hỏi tiếp theo là làm thế nào chúng ta có thể phân biệt dữ liệu “tốt” với dữ liệu xấu. Ở đây, tổng kiểm tra sẽ giúp chúng ta, nhưng không phải đơn giản mà là SHA1. Vậy thì sao? Nó đủ tốt cho git nên nó cũng sẽ phù hợp với chúng ta. Đã quyết định: chúng tôi cung cấp cho mỗi phần thông tin được lưu trữ một tổng kiểm tra và nếu sau khi giải mã nó khớp, điều đó có nghĩa là quá trình giải mã đã thành công.

Bạn cũng sẽ cần số đoạn và tổng độ dài của dữ liệu bí mật. Số mảnh dùng để theo dõi những mảnh nào chúng ta đã giải mã được và mảnh nào còn sót lại. Tổng chiều dài sẽ hữu ích cho chúng ta khi xử lý đoạn cuối cùng, để không ghi dữ liệu không cần thiết (tức là phần đệm). Chà, vì chúng ta vẫn có tiêu đề nên chúng ta sẽ thêm tên của tệp bí mật vào đó. Nó sẽ hữu ích sau khi giải mã, để không phải đoán cách mở nó.

Kiểm nghiệm phương pháp trên thực tế

Để kiểm tra, hãy sử dụng phương tiện phổ biến nhất - ổ đĩa flash. Mình tìm được một cái cũ dung lượng 1GB, khá phù hợp để thử nghiệm. Nếu bạn, giống như tôi, nảy ra ý tưởng không bận tâm đến phương tiện vật lý mà kiểm tra nó trên một tệp - ảnh đĩa, thì tôi sẽ nói ngay: nó sẽ không hoạt động. Khi định dạng một “đĩa” như vậy, Linux sẽ tạo lại tệp và tất cả các khu vực không sử dụng sẽ được lấp đầy bằng số không.

Là một máy chạy Linux, thật không may, tôi phải sử dụng trạm thời tiết trên Raspberry Pi 3. Ở đó không có nhiều bộ nhớ nên chúng tôi sẽ không ẩn các tệp lớn. Chúng tôi giới hạn kích thước tối đa là 10 megabyte. Việc ẩn các tệp quá nhỏ cũng chẳng ích gì: tiện ích ghi dữ liệu vào đĩa theo cụm 4 KB. Do đó, bên dưới chúng tôi sẽ giới hạn ở tệp 3 kb - nó phù hợp với một cụm như vậy.

Chúng tôi sẽ mô phỏng ổ đĩa flash theo từng giai đoạn, kiểm tra sau mỗi giai đoạn xem thông tin ẩn có đọc được hay không:

  1. Định dạng nhanh ở định dạng FAT16 với kích thước cụm 16 KB. Đây là những gì Windows 7 cung cấp để thực hiện với ổ đĩa flash không có hệ thống tệp.
  2. Đổ đầy 50% vào ổ đĩa flash với tất cả các loại rác.
  3. Đổ đầy 100% vào ổ đĩa flash với tất cả các loại rác.
  4. Định dạng “Dài” ở định dạng FAT16 (ghi đè mọi thứ).

Hai cuộc thử nghiệm đầu tiên, đúng như dự đoán, đã kết thúc với thắng lợi hoàn toàn: tiện ích này đã trích xuất thành công 10 megabyte dữ liệu bí mật từ ổ đĩa flash. Nhưng sau khi ổ đĩa flash chứa đầy các tập tin, đã xảy ra lỗi:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

Như bạn có thể thấy, chỉ có 158 cụm được giải mã thành công (632 kilobyte dữ liệu thô, mang lại 636424 byte tải trọng). Rõ ràng là không có cách nào để có được 10 megabyte ở đây, tuy nhiên trong số các cụm này rõ ràng có những bản sao. Bạn thậm chí không thể khôi phục được 1 megabyte theo cách này. Nhưng chúng tôi có thể đảm bảo rằng chúng tôi sẽ khôi phục 3 kilobyte dữ liệu bí mật từ ổ đĩa flash ngay cả sau khi nó được định dạng và ghi vào dung lượng. Tuy nhiên, các thử nghiệm cho thấy hoàn toàn có thể trích xuất một tệp dài 120 kilobyte từ ổ đĩa flash như vậy.

Thật không may, thử nghiệm cuối cùng cho thấy toàn bộ ổ đĩa flash đã bị ghi đè:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

Không một cụm nào còn sót lại... Đáng buồn, nhưng không bi thảm! Trước khi định dạng, chúng ta hãy thử tạo một phân vùng trên ổ đĩa flash và hệ thống tệp đã có sẵn trong đó. Nhân tiện, nó đến từ nhà máy với định dạng chính xác như vậy, vì vậy chúng tôi không làm gì đáng ngờ.
Người ta khá mong đợi rằng dung lượng trống trên ổ đĩa flash đã giảm nhẹ.

Người ta cũng khá mong đợi rằng 10 megabyte không thể bị ẩn trên một đĩa hoàn toàn đầy đủ. Nhưng giờ đây số cụm được giải mã thành công đã tăng hơn gấp đôi!

Total clusters read: 250752, decrypted: 405

Thật không may, không thể tập hợp một megabyte từ các mảnh, nhưng hai trăm kilobyte thì dễ dàng.

Chà, tin tức về lần kiểm tra cuối cùng, lần thứ 4, lần này thật vui: việc định dạng hoàn toàn một ổ đĩa flash như vậy không dẫn đến việc phá hủy tất cả thông tin! 120 kilobyte dữ liệu bí mật hoàn toàn phù hợp với không gian chưa sử dụng.

Bảng tóm tắt kiểm tra:

Steganography by files: ẩn dữ liệu trực tiếp trong các lĩnh vực

Một chút lý thuyết: về không gian trống và các khu vực chưa sử dụng

Nếu bạn đã từng chia ổ cứng của mình thành các phân vùng, bạn có thể nhận thấy rằng không phải lúc nào cũng có thể phân bổ tất cả dung lượng trống trên đĩa. Phần đầu tiên luôn bắt đầu bằng một số thụt đầu dòng (thường là 1 megabyte hoặc 2048 cung). Đằng sau phần cuối cùng, cũng xảy ra trường hợp vẫn còn một “đuôi” nhỏ gồm các lĩnh vực chưa được sử dụng. Và đôi khi có những khoảng trống giữa các phần, mặc dù hiếm khi xảy ra.

Nói cách khác, có những khu vực trên đĩa không thể truy cập được trong quá trình làm việc bình thường với đĩa, nhưng dữ liệu có thể được ghi vào những khu vực này! Và điều đó cũng có nghĩa là đọc nó. Điều chỉnh vì thực tế là còn có bảng phân vùng và mã bộ nạp khởi động, nằm ở vùng trống ở đầu đĩa.

Có thể nói, chúng ta hãy tạm dừng các phần này một chút và nhìn chiếc đĩa từ góc nhìn của một con chim. Ở đây chúng ta có một phân vùng trống trên đĩa. Hãy tạo một hệ thống tập tin trong đó. Chúng ta có thể nói rằng một số khu vực trên đĩa vẫn chưa bị xóa không?

E-e-e - trống cuộn! Câu trả lời hầu như sẽ luôn là có! Thật vậy, trong hầu hết các trường hợp, việc tạo một hệ thống tệp chỉ bao gồm việc ghi một vài khối thông tin dịch vụ vào đĩa, nếu không thì nội dung của phân vùng sẽ không thay đổi.

Và ngoài ra - hoàn toàn theo kinh nghiệm - chúng ta có thể giả định rằng hệ thống tệp không phải lúc nào cũng chiếm hết không gian được phân bổ cho nó cho đến khu vực cuối cùng. Ví dụ: hệ thống tệp FAT16 có kích thước cụm là 64 kilobyte rõ ràng không thể chiếm hoàn toàn một phân vùng có kích thước không phải là bội số của 64 kilobyte. Ở cuối phần như vậy sẽ phải có một “phần đuôi” của một số lĩnh vực không thể truy cập để lưu trữ dữ liệu người dùng. Tuy nhiên, giả định này không thể được xác nhận bằng thực nghiệm.

Vì vậy, để tối đa hóa không gian có sẵn cho steganogram, bạn cần sử dụng hệ thống tệp có kích thước cụm lớn hơn. Bạn cũng có thể tạo phân vùng, ngay cả khi điều này không cần thiết (ví dụ: trên ổ đĩa flash). Không cần phải tạo các khu vực trống hoặc để lại những khu vực chưa được phân bổ - điều này sẽ thu hút sự chú ý của những người dân quan tâm.

Tiện ích cho thí nghiệm

Bạn có thể chạm vào mã nguồn của tiện ích đây

Để xây dựng, bạn sẽ cần Qt phiên bản 5.0 trở lên và OpenSSL. Nếu có gì đó không hoạt động, bạn có thể phải chỉnh sửa tệp steganodisk.pro.

Bạn có thể thay đổi kích thước cụm từ 4 KB thành 512 byte (trong secretfile.h). Đồng thời, chi phí dịch vụ thông tin sẽ tăng lên: tiêu đề và tổng kiểm tra chiếm 68 byte cố định.

Tất nhiên, bạn cần chạy tiện ích này với quyền người dùng root và một cách thận trọng. Sẽ không có câu hỏi nào được đặt ra trước khi ghi đè lên tệp hoặc thiết bị được chỉ định!

Vui thích.

Nguồn: www.habr.com

Thêm một lời nhận xét