Blog

Databricks – Bảo mật

databricks

Bài viết này bao gồm các phần riêng biệt được viết bởi Databricks và SEC Consult tương ứng. Nó đi sâu vào các chi tiết kỹ thuật của các vấn đề bảo mật được phát hiện, các cấu hình bị ảnh hưởng, tác động và các giải pháp được triển khai để giải quyết lỗ hổng. 

Tổng quan

Vào cuối tháng01/ 2023, Databricks đã nhận được một báo cáo từ SEC Consult về một vấn đề tiềm ẩn. Nó cho phép người dùng được xác thực, có đặc quyền thấp của một cụm nâng cao đặc quyền. Nó có quyền truy cập cấp quản trị viên vào các cụm khác trong ranh giới của cùng một cụm không gian làm việc và tổ chức. 

Các cuộc điều tra của Databricks

Cuộc điều tra ban đầu của Databricks cho thấy rằng việc khai thác vấn đề này yêu cầu:

  • Kẻ tấn công tiềm năng phải sở hữu tài khoản được xác thực hợp lệ
  • Không gian làm việc hiện hành phải bật tập lệnh khởi tạo toàn cầu cũ cho các cụm, hoặc cách khác, sự hiện diện của tập lệnh init được cấu hình sẵn (được đặt tên theo cụm hoặc trong phạm vi cụm) được lưu trữ trên DBFS. 

Ngược lại với trường hợp tập lệnh init cụm được lưu trữ trong DBFS. Nơi lỗ hổng bảo mật chỉ có thể bị khai thác khi có tập lệnh. Việc kích hoạt tập lệnh init toàn cầu (không có tệp tập lệnh) là đủ để phát hiện ra vấn đề này.

Trong hai trường hợp

Trong cả hai trường hợp (tập lệnh init toàn cầu kế thừa được bật hoặc tập lệnh khởi tạo cụm được lưu trữ trong DBFS). Người dùng có đặc quyền thấp được xác thực có thể thêm hoặc kiểm soát tập lệnh init. Và thực thi các lệnh bổ sung bằng cách sử dụng các đặc quyền nâng cao liên quan đến việc chạy tập lệnh init. Databricks đã không tìm thấy bằng chứng về sự leo thang đặc quyền như vậy xảy ra trong thực tế.

Các tập lệnh init toàn cầu đã rơi vào trạng thái không dùng nữa cách đây gần 3 năm. Khách hàng vô hiệu hóa các tập lệnh kế thừa đó bằng một thao tác chuyển đổi đơn giản. Nó đã có trong giao diện người dùng sản phẩm ( AWS | Azure ).

Dễ dàng chuyển đổi có sẵn để vô hiệu hóa tập lệnh init toàn cầu kế thừa
Hình 1: Dễ dàng chuyển đổi khả dụng để vô hiệu hóa tập lệnh init toàn cầu kế thừa

Bảng tóm tắt các kịch bản phổ biến nhất cho các loại tập lệnh init khác nhau ( AWS | Azure | GCP ):  

Bắt đầu loại kịch bảnđám mây áp dụngtình trạng lỗ hổngtrước đây không dùng nữa
Kế thừa toàn cầuAWS, AzureDễ bị tổn thươngĐúng
tên cụm AWS, AzureDễ bị tổn thươngĐúng
Toàn cầuAWS, Azure, GCPkhông dễ bị tổn thươngKHÔNG
Phạm vi cụm
(được lưu trữ trên DBFS)
AWS, Azure, GCPDễ bị tổn thươngKHÔNG
Phạm vi cụm
(được lưu trữ dưới dạng tệp không gian làm việc)
AWS, Azure, GCPkhông dễ bị tổn thươngKHÔNG
Phạm vi cụm
(được lưu trữ trên AWS/Azure/GCP)
AWS, Azure, GCPkhông dễ bị tổn thươngKHÔNG

Các bổ sung củng cố nền tảng Databricks

Dựa vào báo cáo SEC Consult, Databricks củng cố nền tảng của mình bằng các bổ sung sau:

Vô hiệu hóa việc tạo không gian làm việc mới

Bằng cách sử dụng các loại tập lệnh init không dùng nữa (cụ thể là: tập lệnh init toàn cầu cũ và tập lệnh có tên cụm);

Công bố thời hạn cuối cùng nghiêm ngặt

Việc này áp dụng đối với tất cả các loại tập lệnh init không dùng nữa để đẩy nhanh quá trình di chuyển sang các giải pháp thay thế an toàn hơn;

Khuyến khích người dùng không vô hiệu hóa các tập lệnh init không dùng nữa

Người dùng được khuyến khích không vô hiệu hóa các tập lệnh init và được hỗ trợ chuyển sang các lựa chọn thay thế an toàn hơn bằng cách cung cấp các công cụ để tự động hóa quy trình cho cả tập lệnh init toàn cầu cũ và tập lệnh init có tên cụm 

Thêm hỗ trợ cho các tập lệnh init trong phạm vi cụm

Việc này được lưu trữ trong các tệp không gian làm việc ( AWS | Azure | GCP ), một giải pháp thay thế an toàn hơn được cung cấp rộng rãi gần đây . Chúng tôi cũng đã thay đổi vị trí mặc định của các tập lệnh init trong phạm vi cụm trong giao diện người dùng sản phẩm thành các tệp không gian làm việc và thêm một thông báo hiển thị cho những người dùng vẫn cố gắng sử dụng DBFS để lưu trữ các tập lệnh init.

Đề xuất mới để sử dụng tệp không gian làm việc thay vì DBFS
Hình 2: Đề xuất mới để sử dụng tệp không gian làm việc thay vì DBFS

Hỗ trợ

Hỗ trợ tệp trong không gian làm việc cho phép người dùng Databricks lưu trữ mã nguồn Python. Bộ dữ liệu tham chiếu bất kỳ loại nội dung tệp nào khác tiếp bên cạnh sổ ghi chép của họ. Các tệp không gian làm việc mở rộng các khả năng có sẵn trước đây trong Databricks Repos. Nó có trên toàn bộ nền tảng. Ngay cả khi người dùng không làm việc với các hệ thống kiểm soát phiên bản. Các tệp trong không gian làm việc cũng cho phép bạn bảo mật quyền truy cập vào các tệp hoặc thư mục riêng lẻ bằng cách sử dụng Danh sách kiểm soát truy cập (ACL) ( AWS | Azure | GCP ) của đối tượng đó , có thể được định cấu hình để giới hạn quyền truy cập đối với người dùng hoặc nhóm.

Các tệp không gian làm việc là vị trí mặc định mới để lưu trữ các tập lệnh init
Hình 3: Workspace files là vị trí mặc định mới để lưu trữ init script

Hướng dẫn và khuyến nghị của Databricks

Chúng tôi đã khuyến khích khách hàng tránh xa các tập lệnh init cũ. Và tệp không được dùng nữa trong ba năm qua. Phát hiện bảo mật này do SEC Consult báo cáo gần đây chỉ nhấn mạnh lý do tại sao khách hàng nên hoàn thành hành trình di chuyển này càng sớm càng tốt. Đồng thời, việc giới thiệu các tệp không gian làm việc cho tập lệnh init ( AWS | Azure | GCP ) đánh dấu cột mốc ban đầu trong kế hoạch của chúng tôi nhằm cung cấp giải pháp lưu trữ hiện đại và an toàn hơn cho DBFS.  

Cách tăng cường bảo mật

Khách hàng có thể tăng cường bảo mật cho việc triển khai Databricks của họ. Họ giảm thiểu vấn đề bảo mật được thảo luận trong blog này bằng cách thực hiện như sau:

Vô hiệu hóa trên Databricks

Vô hiệu hóa ngay lập tức các tập lệnh khởi tạo toàn cầu kế thừa ( AWS | Azure ) nếu không được sử dụng tích cực: đây là một bước an toàn, dễ dàng và ngay lập tức để đóng vectơ tấn công tiềm ẩn này.

Di chuyển tập lệnh cũ sang loại tập lệnh init toàn cầu mới

Những khách hàng đã triển khai tập lệnh init toàn cầu cũ trước tiên nên di chuyển tập lệnh cũ sang loại tập lệnh init toàn cầu mới ( sổ ghi chép này có thể được sử dụng để tự động hóa công việc di chuyển) và sau bước di chuyển này, hãy tiến hành vô hiệu hóa phiên bản cũ như đã chỉ ra trong bước trước

Các tập lệnh init có tên cụm

Các tệp này cũng bị ảnh hưởng tương tự bởi sự cố này và cũng không được dùng nữa: những khách hàng vẫn đang sử dụng loại tập lệnh init này nên tắt các tập lệnh init có tên cụm ( AWS | Azure ), di chuyển chúng sang các tập lệnh có phạm vi cụm và đảm bảo rằng tập lệnh được lưu trữ trong vị trí lưu trữ tệp không gian làm việc mới ( AWS | Azure | GCP ). Sổ tay này có thể được sử dụng để tự động hóa công việc di chuyển.

Các tập lệnh init trong phạm vi cụm 

Các tệp này hiện có được lưu trữ trên DBFS nên được di chuyển sang vị trí tệp không gian làm việc thay thế, an toàn hơn ( AWS | Azure | GCP ).

Sử dụng Công cụ phân tích bảo mật Databricks (SAT) 

Công cụ này để tự động kiểm tra tình trạng bảo mật của các cấu hình không gian làm việc Databricks của bạn dựa trên các phương pháp bảo mật tốt nhất của Databricks.

Lưu ý

Bản sao của báo cáo kỹ thuật được viết bởi Florian Roth và Marius Bartholdy của SEC Consult. Mặc dù nghiên cứu được mô tả bên dưới đã được tiến hành và thử nghiệm với Azure Databricks làm ví dụ. Nhưng những phát hiện liên quan đến các loại tập lệnh init không được dùng nữa sẽ ảnh hưởng đến các nhà cung cấp đám mây khác như được trình bày trong bảng ở trên. 

Một lần nữa xin cảm ơn SEC Consult và tất cả các nhà nghiên cứu bảo mật đang làm việc với chúng tôi để làm cho Databricks trở nên an toàn hơn mỗi ngày. Nếu bạn là nhà nghiên cứu bảo mật, chúng tôi sẽ gặp bạn tại hackerone.com/databricks .

Nghiên cứu bảo mật tập lệnh init Databricks

Người dùng có đặc quyền thấp có thể phá vỡ sự cô lập giữa các cụm tính toán Databricks trong ranh giới của cùng một không gian làm việc và tổ chức bằng cách thực thi mã từ xa. Điều này sau đó sẽ cho phép kẻ tấn công truy cập vào tất cả các tệp và bí mật trong không gian làm việc cũng như nâng cấp các đặc quyền của chúng lên các đặc quyền của quản trị viên không gian làm việc.

Mọi người dùng trong không gian làm việc đều có thể truy cập đầy đủ Hệ thống tệp Databricks (DBFS) . Vì các tập lệnh init toàn cầu kế thừa và phạm vi cụm cũng được lưu trữ ở đó. Nên kẻ tấn công được xác thực có quyền mặc định có thể:

  1. Tìm và sửa đổi tập lệnh init trong phạm vi cụm hiện có.
  2. Đặt tập lệnh mới vào vị trí mặc định cho tập lệnh init toàn cầu kế thừa.

1) Chuỗi tấn công bằng cách sử dụng tập lệnh init trên Databricks hiện có

Tùy chọn mặc định để cung cấp các loại tập lệnh init không dùng nữa. Chẳng hạn như toàn cầu kế thừa hoặc được đặt tên theo cụm là tải chúng lên DBFS. Do DBFS được chia sẻ giữa tất cả các cụm điện toán bên trong cùng một không gian làm việc. Nên có thể tìm hoặc đoán bất kỳ tập lệnh init nào tồn tại trước đó. Nó đã được định cấu hình trước đó trên một cụm và được lưu trữ trong DBFS. Điều này có thể đạt được bằng cách liệt kê nội dung của các thư mục DBFS hiện có:

display(dbutils.fs.ls("dbfs:/databricks/scripts"))

Tệp .sh

Tất cả các tệp .sh được tìm thấy có khả năng là các tập lệnh init trong phạm vi cụm. Do đó, mục tiêu là thay thế chúng bằng cách nào đó. Mặc dù không thể ghi đè trực tiếp tệp. Nhưng với đoạn mã sau, nó có thể được đổi tên và tạo một tập lệnh mới với tên cũ. Tập lệnh độc hại mới chứa một trình bao đảo ngược đơn giản sẽ được khởi chạy định kỳ. Vì cấu hình cụm chỉ biết tên tập lệnh. Nên ngay khi tập lệnh init được kích hoạt lại, một trình bao đảo ngược, với các đặc quyền gốc trên cụm máy tính, đã được nhận:

Databricks
Hình 4: Init script và shell mới

Bí mật cấu hình spark

Các bí mật chỉ có thể được truy xuất trong thời gian chạy bởi chính phiên bản tính toán thông qua danh tính được quản lý. Ngay cả quản trị viên không gian làm việc cũng không thể đọc chúng. Tuy nhiên, vì chúng có sẵn cho cụm máy tính. Ngay khi nó được khởi tạo nên có thể truy xuất các giá trị văn bản rõ ràng của chúng. Bạn có thể tìm thấy các bí mật cấu hình Spark tại /tmp/custom-spark.conf. Trong khi các bí mật trong các biến môi trường có thể truy cập được bằng cách đọc tệp /proc/<process-id>/environ của đúng quy trình.

Bảo mật tập lệnh khởi tạo cụm Databricks

Rò rỉ mã thông báo

Sử dụng một lỗ hổng được tìm thấy ban đầu bởi Joosua Santasalo từ Secureworks . Nó có thể làm rò rỉ mã thông báo API Databricks của những người dùng khác. Bao gồm cả quản trị viên nếu họ hoạt động trên cùng một phiên bản. Phát hiện ban đầu đã được khắc phục bằng cách cách ly người dùng với nhau. Đặc biệt là với quản trị viên. Tuy nhiên, với lỗ hổng được trình bày, sự cô lập có thể bị phá vỡ bằng cách thực thi các tập lệnh do kẻ tấn công kiểm soát. Do đó, cách khai thác cũ có hiệu lực trở lại.

Sử dụng lớp vỏ đảo ngược đã thiết lập trước đó. Bạn có thể nắm bắt lưu lượng của mặt phẳng điều khiển. Ngay khi chúng tôi bắt đầu một tác vụ với người dùng quản trị. Chẳng hạn như chạy một sổ ghi chép đơn giản, mã thông báo đã được gửi không được mã hóa và có thể bị rò rỉ:

Hình 5 - chụp gói trên cụm cửa sau tiết lộ apiToken
Hình 5: chụp gói tin trên cụm cửa hậu tiết lộ apiToken

Sau đó, mã thông báo đã chụp có thể được sử dụng để xác thực các yêu cầu đối với API REST của Databricks. Ví dụ sau cho phép xem phạm vi bí mật và do đó xác nhận rằng mã thông báo có đặc quyền quản trị:

Sau đó, mã thông báo được khai thác có thể được sử dụng để xác thực các yêu cầu đối với API REST của Databricks.

2) Chuỗi tấn công bằng cách sử dụng các tập lệnh init toàn cầu kế thừa

Vectơ tấn công tương tự đã ảnh hưởng đến các tập lệnh khởi tạo toàn cầu kế thừa. Chúng không còn được dùng nữa vào năm 2020. Nhưng vẫn được bật theo mặc định trong tất cả các không gian làm việc. Và cũng được lưu trữ trên DBFS, cụ thể là tại dbfs:/databricks/init/. Bất kỳ cụm nào cũng sẽ thực thi nội dung của chúng khi khởi tạo. Do đó, chỉ cần tạo một tập lệnh mới trong thư mục đó. Nó cuối cùng sẽ dẫn đến việc thực thi mã trên tất cả các cụm.

Nguồn: Internet

>>Tìm hiểu thêm các khóa học tại đây!

Leave a Reply

Your email address will not be published. Required fields are marked *