Khai thác dưa chua Python

Trong những khoảnh khắc cuối cùng của năm 2021, chúng tôi đã biết về một lỗ hổng bảo mật mới trong một thư viện chưa từng được biết đến trước đây có tên là “Log4j”. Khởi đầu là một báo cáo lỗi, nhanh chóng leo thang thành một sự kiện an ninh quốc gia trên toàn thế giới. Sự gián đoạn đã được cảm nhận trong vô số dịch vụ phổ biến. Google báo cáo có 500 kỹ sư đi qua các cơ sở mã của họ để phân tích tác động. các bạn. S. chính phủ liên bang đã ban hành một chỉ thị khẩn cấp yêu cầu các cơ quan của mình giảm thiểu các lỗ hổng này ngay lập tức. Các cuộc tấn công của các tác nhân quốc gia/nhà nước ở Trung Quốc, Iran và Bắc Triều Tiên đã được phát hiện trong thời gian thực. CVE-2021-44228 nhận được điểm CVSS là 10. 0 — biểu thị mức độ nghiêm trọng cao nhất có thể. Meme đã được thực hiện

Chúng tôi sẽ không đi vào quá nhiều chi tiết kỹ thuật ở đây. Tuy nhiên, mấu chốt đáng sợ của khai thác log4j là nó cho phép kẻ tấn công thực thi mã tùy ý trong các quy trình đặc quyền ở rất nhiều máy chủ trên toàn thế giới. Điều quan trọng, "tùy ý" ở đây có nghĩa là, bất cứ điều gì

Bạn có nên quan tâm?

Bạn là nhà khoa học dữ liệu hoặc kỹ sư ML. Bạn không sử dụng Log4j [hoặc không biết rằng bạn làm. ]. Bạn thậm chí không sử dụng Java. Bạn sẽ không bị chết khi sử dụng bất kỳ ngôn ngữ dựa trên JVM nào. Bạn chỉ cần sử dụng trăn. Bạn đã sẵn sàng. Chà… bạn có sử dụng dũa dưa chua không? . load [đường dẫn]” rung chuông nào?

Nếu bạn hoặc nhóm của bạn gặp rủi ro, bạn có thể muốn đồng ý với chúng tôi tại đây, vì các máy nội bộ của tổ chức bạn có thể gặp rủi ro tương tự như các máy sử dụng Log4j đã từng gặp phải.

Bạn có thể tuần tự hóa

Khoa học dữ liệu hiện đại không được thực hiện trong chân không. Các học viên phụ thuộc rất nhiều vào các mô hình và dữ liệu điểm chuẩn được chia sẻ bởi bên thứ ba và mã nguồn mở. Đây có thể là một điều tốt. các tạo phẩm được chia sẻ và có sẵn trên toàn cầu có thể giúp các công ty nhanh chóng áp dụng các phương pháp tiếp cận và bộ dữ liệu thuật toán mới và hiện đại nhất, điều này rất quan trọng trong thực tế ngày nay về tiến độ nhanh chưa từng thấy. Nếu không áp dụng các mô hình của bên thứ ba, một hệ thống sản xuất có thể nhanh chóng trở nên lỗi thời. Tuy nhiên, nguồn gốc của những đồ tạo tác này và chuỗi phân phối của chúng có luôn đáng tin cậy không?

Để trả lời điều đó, hãy kiểm tra tuần tự hóa. Tuần tự hóa là cơ chế mà các mô hình và dữ liệu của bên thứ ba thường được nhập vào bộ nhớ quy trình của bạn. Tuần tự hóa giải quyết một vấn đề mà hầu hết mọi lập trình viên ****, đặc biệt là xử lý dữ liệu, gặp phải hàng ngày. ghi các đối tượng trong bộ nhớ vào các tệp, để chúng có thể được lưu trữ và chia sẻ liên tục, sau đó được "giải tuần tự hóa" trở lại bộ nhớ tiến trình

Chuỗi hóa dưa chua thật tuyệt vời

Đối với hầu hết các lập trình viên, việc sử dụng Pickle - hoặc các trình nối tiếp được xây dựng trên nó giống như cách mà PyTorch sử dụng - có vẻ giống như một dạng ma thuật Python điển hình. Nó rất đơn giản. Hãy xem xét đoạn mã sau

và thì đấy, đối tượng loại A ** của bạn được lưu trữ trong myfile. pkl. Sau đó,

nếu bạn chạy điều này sau khi đối tượng được đánh số thứ tự [theo tập lệnh đầu tiên], bạn sẽ nhận thấy rằng một đối tượng được đánh số thứ tự gọn gàng chứa đối tượng được đánh số thứ tự của bạn và tập lệnh in thành công “3”

Điều này có vẻ rất tự nhiên, nhưng hãy dừng lại một chút và đánh giá cao một vài điều mà Pickle đang làm cho chúng ta tại đây. Đầu tiên, những người trong chúng ta đã từng viết một lớp tùy chỉnh có các đối tượng có thể tuần tự hóa thành định dạng không kén chọn [e. g. JSON hoặc sử dụng ngôn ngữ lập trình không phải Python] có thể đánh giá rất cao thực tế là với Pickle, bạn thường không phải viết bất kỳ mã tuần tự hóa tùy chỉnh nào. Pickle đảm nhận việc quyết định thứ tự tuần tự hóa trường, bố cục bộ nhớ lưu trữ, các lệnh gọi đệ quy để tuần tự hóa các trường đối tượng không nguyên thủy và hầu hết mọi thứ khác. Thứ hai, lưu ý rằng tập lệnh thứ hai không cần gọi import json, nhưng bằng cách nào đó, lệnh gọi đến a. print[] “thần kỳ” quản lý để sử dụng chức năng json — thật tiện lợi

Không ăn trưa miễn phí

Thật không may, giao diện cực kỳ đơn giản của pickle phải trả giá. Pickle's deserializer, được gọi vào bất cứ khi nào chúng ta gọi "pickle. tải” [hoặc “ngọn đuốc. trọng tải". ], là một máy ảo chính thức, có thể chạy mã tùy ý trong quá trình tải đối tượng. Nó được xây dựng rõ ràng để cho phép các đối tượng được tuần tự hóa đi kèm với các hướng dẫn tùy ý về cách giải tuần tự hóa chúng. Nói cách khác, Pickle deserialization dễ dàng hỗ trợ chạy mã tùy ý được chỉ định bởi serializer [tác giả gốc của tệp]. Trên thực tế, nó đơn giản như một vài dòng mã, bằng cách sử dụng chức năng “giảm” được chỉ định. Ví dụ: hãy thử cách sau [bạn có thể thay thế “đèn pin” bằng “dưa” và “lưu” bằng “tải”]. Ngoài ra, vui lòng chuyển sang Phụ lục bên dưới để có cái nhìn sâu hơn một chút về opcode của máy ảo Pickle

Tài liệu của Python cảnh báo về việc sử dụng lỏng lẻo quá trình khử lưu huỳnh dưa chua. Nó nhằm mục đích hiệu quả và dễ sử dụng — không phải bảo mật, sách hướng dẫn cảnh báo chúng tôi bằng chiếc hộp màu cam sáng đáng sợ này


Không sử dụng Pickle?

Thật không may, mặc dù vấn đề bảo mật [trong] của việc sử dụng Pickle để giải tuần tự hóa các tệp có nguồn gốc không đáng tin cậy đã được biết đến trong nhiều năm và mặc dù có các khuyến nghị rõ ràng chống lại điều này trong tài liệu, nhưng nó đã trở thành một thông lệ tiêu chuẩn để làm điều đó. Các thư viện cực kỳ phổ biến như Hugging Face Transformers sử dụng pickle [hoặc Torch serialization] một cách tự do để chia sẻ và nhập các mô hình, cũng như nhiều triển khai [hầu hết?] mà bạn có thể tìm thấy trong các trang web chia sẻ tạo phẩm như Model Zoo. Giải tuần tự hóa các tệp Pickle có nguồn gốc đáng ngờ, do đó khiến bản thân phải thực thi mã tùy ý, đã trở thành bản chất thứ hai đối với các nhà khoa học dữ liệu

Pickle có sửa được không?

Thật không may, Pickle sẽ không được “sửa lỗi” [= được bảo mật] trong phiên bản tương lai, cũng như không có cách đơn giản nào để phát hiện hoặc ngăn chặn việc khai thác. Lỗ hổng của Pickle gắn chặt với tính hữu dụng ấn tượng của nó. Về mặt kỹ thuật, máy ảo của Pickle không phải là hộp cát và trình thông dịch của Python cũng vậy - điều đó có nghĩa là việc đảm bảo giải tuần tự hóa an toàn cho các tệp tùy ý sẽ là một thách thức ghê gớm

Chúng ta có thể làm gì?

Tại Robust Intelligence, chúng tôi chạy một loạt bài kiểm tra căng thẳng bao gồm cả bảo mật tệp Pickle. Liên hệ với chúng tôi để được học nhiều điều hơn

ruột thừa. Tháo dỡ dưa chua

Bên dưới, chúng ta thấy các opcode VM pickle “đã được tháo rời” [=con người có thể đọc được] cho lớp “tải trọng” của chúng ta. Ngay cả khi không biết ngữ nghĩa opcode, thứ mà chúng ta sẽ không đề cập ở đây, chúng ta có thể tưởng tượng rằng mã này tải tệp “posix. system[]” [tương đương với “os. system”] và gọi nó, chuyển chuỗi ‘echo “boom”’ làm đối số của nó

Cái gì nhanh hơn dưa Python?

quickle là định dạng tuần tự hóa nhỏ và nhanh cho một tập hợp con các loại Python. Nó dựa trên Pickle, nhưng bao gồm một số tối ưu hóa và tiện ích mở rộng để cung cấp hiệu suất và bảo mật được cải thiện. Đối với các loại được hỗ trợ, sắp xếp theo thứ tự một tin nhắn bằng quickle có thể nhanh hơn ~2-10 lần so với sử dụng pickle.

Là dưa chua JSON hoặc python nhanh hơn?

JSON là định dạng nhẹ và nhanh hơn nhiều so với Pickling . Luôn có rủi ro bảo mật với Pickle. Nên tránh giải nén dữ liệu từ các nguồn không xác định vì nó có thể chứa dữ liệu độc hại hoặc sai sót. Không có lỗ hổng bảo mật nào khi sử dụng JSON và không có mối đe dọa bảo mật nào.

Tôi có thể sử dụng cái gì thay vì dưa chua trong Python?

Một lựa chọn thay thế là cPickle . Nó gần giống với pickle , nhưng được viết bằng C, giúp nó nhanh hơn tới 1000 lần. Tuy nhiên, đối với các tệp nhỏ, bạn sẽ không nhận thấy sự khác biệt về tốc độ. Cả hai đều tạo ra các luồng dữ liệu giống nhau, có nghĩa là Pickle và cPickle có thể sử dụng cùng một tệp.

Pickle dump trong Python là gì?

Bãi chứa dưa chua Python . dưa chua. hàm dump[] nhận 3 đối số. Đối số đầu tiên là đối tượng mà bạn muốn lưu trữ. Đối số thứ hai là đối tượng tệp bạn nhận được bằng cách mở tệp mong muốn ở chế độ ghi nhị phân [wb]. to store the object data to the file. pickle. dump[] function takes 3 arguments. The first argument is the object that you want to store. The second argument is the file object you get by opening the desired file in write-binary [wb] mode.

Chủ Đề