1. Trang chủ
  2. » Giáo Dục - Đào Tạo

(TIỂU LUẬN) THỰC tập cơ sở CHUYÊN NGHÀNH AN TOÀN PHẦN mềm NGHIÊN cứu ENVIROMENT VARIABLE AND SET UID (ENVIROMENT VARIABLE AND SET UID LAB)

46 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nghiên cứu Environment Variable and Set-UID (Environment Variable and Set-UID Lab)
Người hướng dẫn PGS.TS Lương Thế Dũng
Trường học Học viện Kỹ thuật Mật mã
Chuyên ngành An Toàn Phần Mềm
Thể loại Thực tập cơ sở
Năm xuất bản 2021
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 46
Dung lượng 6,67 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • CHƯƠNG I: TỔNG QUAN VỀ ENVIRONMENT VARIABLES VÀ SET-UID PROGRAM (6)
    • 1.1. Environment Variables (6)
    • 1.2. Set-UID Program (0)
    • 1.3. Mục tiêu chính của Lab (7)
    • 1.4. Chuẩn bị cho bài Lab (7)
    • 1.5. Cài đặt môi trường ảo Ubuntu v16.04 của SEED Labs (10)
  • CHƯƠNG II: TIẾN HÀNH THỰC HIỆN VÀ NGHIÊN CỨU CHUYÊN SÂU BÀI (16)
    • 2.3. Task 3: Biến môi trường và hàm execve() (21)
    • 2.4. Task 4: Biến môi trường và hàm system () (24)
    • 2.5. Task 5: Các biến môi trường và Set-UID program (25)
    • 2.6. Task 6: The PATH Environment variable and Set-UID programs (29)
    • 2.7. Task 7: The LD_PRELOAD environment variable and Set-UID Programs (32)
    • 2.8. Task 8: Gọi các chương trình bên ngoài bằng hàm system() và hàm execve() (38)
    • 2.9. Task 9: Capability Leaking (42)
  • CHƯƠNG III: KẾT LUẬN (45)
  • TÀI LIỆU THAM KHẢO (46)

Nội dung

Environment Variables Biến môi trường là những giá trị được cung cấp và phụ thuộc vào Hệ điều hành,vậy nên sự thay đổi của các biến môi trường khi thay đổi môi trường chạy sẽ ảnh hưởngđế

TỔNG QUAN VỀ ENVIRONMENT VARIABLES VÀ SET-UID PROGRAM

Environment Variables

Biến môi trường là các giá trị do Hệ điều hành cung cấp và ảnh hưởng trực tiếp đến quá trình thực thi của ứng dụng Việc thay đổi biến môi trường khi môi trường chạy thay đổi có thể tác động lớn đến hoạt động của ứng dụng đó Do đó, các biến môi trường đóng vai trò quan trọng trong việc đảm bảo ứng dụng hoạt động chính xác và ổn định trong môi trường hệ thống.

Biến môi trường lần đầu được giới thiệu dưới dạng hiện đại vào năm 1979 với Version 7 của Unix, sau đó trở thành một thành phần thiết yếu trong tất cả các phiên bản hệ điều hành Unix, bao gồm Linux và macOS Từ năm 1982, PC DOS 2.0 và các hệ điều hành kế thừa của Microsoft như Microsoft Windows và OS/2 cũng đã tích hợp biến môi trường, mặc dù với cú pháp, cách sử dụng và tên biến tiêu chuẩn khác nhau.

Việc thiết lập biến môi trường là cần thiết để bảo vệ thông tin cá nhân và dữ liệu nhạy cảm trong quá trình phát triển phần mềm Ví dụ, trong quá trình làm việc với GitHub, các developer thường chia sẻ mã nguồn của dự án, nhưng để đảm bảo an toàn, họ cần ẩn các thông tin như API key hoặc email cá nhân Do đó, việc sử dụng biến môi trường giúp mỗi máy tính cá nhân có thể cài đặt các thông tin riêng mà không tiết lộ cho người khác, đồng thời giúp quản lý dự án dễ dàng hơn Các biến môi trường giúp kiểm soát dữ liệu nhạy cảm, tránh lộ lọt thông tin quan trọng, và hỗ trợ lập trình viên sử dụng tài khoản cá nhân một cách linh hoạt mà vẫn đảm bảo bảo mật.

1.3 Mục tiêu chính của Lab

Mục tiêu chính của bài lab là giúp sinh viên hiểu rõ cách các biến môi trường ảnh hưởng đến hành vi của hệ thống và chương trình Mặc dù các biến môi trường đóng vai trò quan trọng trong hoạt động của các ứng dụng, nhưng nhiều lập trình viên chưa nắm rõ cách chúng hoạt động như thế nào Việc hiểu sai hoặc thiếu kiến thức về các biến môi trường có thể dẫn đến các lỗ hổng bảo mật trong chương trình, đặc biệt là những chương trình sử dụng quyền cao như Set-UID Qua bài lab này, sinh viên sẽ nắm được cách các biến môi trường được truyền từ quy trình mẹ sang quy trình con, cách chúng ảnh hưởng đến chức năng của hệ thống, và tầm quan trọng của chúng trong bảo mật hệ thống Đặc biệt, bài học giúp nhận thức rõ về tác động của các biến môi trường đối với hoạt động của các chương trình đặc quyền, từ đó nâng cao kiến thức về bảo mật và quản lý hệ thống.

1.4 Chuẩn bị cho bài Lab

Truy cập đường link: https://www.virtualbox.org/wiki/Downloads Để tải và cài đặt

Sau khi tải về thì chạy chương trình để cài đặt vào máy Chọn Next

Chọn Finish để kết thúc quá trình cài đặt Bên dưới là giao diện sau khi cài đặt hoàn tất

1.5 Cài đặt môi trường ảo Ubuntu v16.04 của SEED Labs

Truy cập vào trang web : https://seedsecuritylabs.org/labsetup.html Chọn version16.04 như hình bên dưới và tải về theo đường dẫn đính kèm

Quay lại với Oracle VM VirtualBox , Chọn New ,lựa chọn các cài đặt như hình bên dưới và chọn Next.

Chọn Next cho đến khi đến phần Hark Disk Chọn vào “Use an exitsting virtual hard disk file” và chọn vào icon được khoanh vùng đen.

Chọn đến đường dẫn lúc nãy vừa giải nén file Ubuntu v16.04 và chọn vào file bên dưới nhấn Open

Sau khi chọn đường dẫn xong sẽ hiện giống như ảnh màn hình sau và click vào “SEEDUbuntu-16.04-32bit.vmdk” và chọn Choose.

Chọn Start để tiến hành cài đặt bên trong

Quá trình cài đặt hoàn tất

Lưu ý : Khi đó́ng máy Ubuntu ảo Các bạn nên chọn “Save the machine state” Để có́ thể lưu lại những gì mình đang làm.

Mục tiêu chính của Lab

Mục tiêu chính của bài lab này là giúp sinh viên hiểu rõ cách các biến môi trường ảnh hưởng đến hành vi của hệ thống và chương trình Các biến môi trường tác động đáng kể đến hoạt động của phần mềm, nhưng cách chúng hoạt động vẫn chưa được nhiều lập trình viên hiểu rõ, dẫn đến nguy cơ xuất hiện lỗ hổng bảo mật trong các chương trình sử dụng biến môi trường Qua bài lab, sinh viên sẽ nắm được cách các biến môi trường được truyền từ quy trình mẹ sang quy trình con, cũng như cách chúng ảnh hưởng đến hệ thống và các chương trình, đặc biệt là các chương trình Set-UID có đặc quyền cao.

Chuẩn bị cho bài Lab

Truy cập đường link: https://www.virtualbox.org/wiki/Downloads Để tải và cài đặt

Sau khi tải về thì chạy chương trình để cài đặt vào máy Chọn Next

Chọn Finish để kết thúc quá trình cài đặt Bên dưới là giao diện sau khi cài đặt hoàn tất

Cài đặt môi trường ảo Ubuntu v16.04 của SEED Labs

Truy cập vào trang web : https://seedsecuritylabs.org/labsetup.html Chọn version16.04 như hình bên dưới và tải về theo đường dẫn đính kèm

Quay lại với Oracle VM VirtualBox , Chọn New ,lựa chọn các cài đặt như hình bên dưới và chọn Next.

Chọn Next cho đến khi đến phần Hark Disk Chọn vào “Use an exitsting virtual hard disk file” và chọn vào icon được khoanh vùng đen.

Chọn đến đường dẫn lúc nãy vừa giải nén file Ubuntu v16.04 và chọn vào file bên dưới nhấn Open

Sau khi chọn đường dẫn xong sẽ hiện giống như ảnh màn hình sau và click vào “SEEDUbuntu-16.04-32bit.vmdk” và chọn Choose.

Chọn Start để tiến hành cài đặt bên trong

Quá trình cài đặt hoàn tất

Lưu ý : Khi đó́ng máy Ubuntu ảo Các bạn nên chọn “Save the machine state” Để có́ thể lưu lại những gì mình đang làm.

TIẾN HÀNH THỰC HIỆN VÀ NGHIÊN CỨU CHUYÊN SÂU BÀI

Task 3: Biến môi trường và hàm execve()

Trong task này, chúng ta nghiên cứu cách các biến môi trường bị ảnh hưởng khi một chương trình được thực thi qua hàm execve(), hàm này gọi hệ thống để tải và thực thi một lệnh mới mà không tạo ra quy trình mới Khi sử dụng execve(), nội dung văn bản, dữ liệu, bss và ngăn xếp của quá trình gọi bị ghi đè bởi chương trình mới, chạy bên trong cùng một quy trình Câu hỏi đặt ra là các biến môi trường có tự động được kế thừa bởi chương trình mới hay không, điều này đã được kiểm tra bằng cách biên dịch và thực thi chương trình envex.c, với kết quả lưu trong file beforeeditoutput.

Như ta quan sát thấy output của chương trình này là rỗng.

Tiếp theo, ta bắt đầu chỉnh sửa file envex.c trên tại điểm: execve("/usr/bin/env", argv, environ);

Sau đó́, tiến hành biên dịch và thực thi chương trình vừa chỉnh sửa thành output tương ứng và lưu vào file aftereditoutput.

Như ta quan sát được, khác với beforeeditoutput rỗng thì aftereditoutput lại có́ output.

Mặc dù biến môi trường chung đã được chỉ định trong chương trình ban đầu, chương trình trước đó chứa NULL là đối số thứ ba của trình thực thi, trong khi chương trình afteredit đã chuyển biến môi trường là đối số thứ ba của trình thực thi Thay đổi này ảnh hưởng trực tiếp đến kết quả đầu ra, vì đối số thứ ba của hàm execute() xác định biến môi trường của tiến trình hiện tại Khi biến môi trường không được truyền qua trong chương trình ban đầu, không có biến môi trường nào liên kết với quy trình mới, dẫn đến kết quả đầu ra là null Tuy nhiên, sau khi chỉnh sửa, biến môi trường đã được chuyển làm đối số thứ ba, chứa tất cả các biến môi trường của quy trình hiện tại, do đó kết quả đầu ra chứa đầy đủ các biến môi trường như mong đợi Tóm lại, đối số thứ ba của lệnh execute() là để nhận các biến môi trường của chương trình.

Task 4: Biến môi trường và hàm system ()

502 Bad GatewayUnable to reach the origin service The service may be down or it may not be responding to traffic from cloudflared

502 Bad GatewayUnable to reach the origin service The service may be down or it may not be responding to traffic from cloudflared

Task 5: Các biến môi trường và Set-UID program

502 Bad GatewayUnable to reach the origin service The service may be down or it may not be responding to traffic from cloudflared

Tiếp theo, ta tiến hành biên dịch và chạy chương trình envsu.c dưới đây.

Sau khi biên dịch và chạy chương trình, bạn cần thay đổi quyền sở hữu và quyền truy cập của tệp bằng các lệnh sau: `sudo chown root filename` để đặt người dùng root làm chủ sở hữu của tệp, và `sudo chmod 4755 filename` để thiết lập quyền cho tệp trở thành chương trình SET-UID bằng cách đặt bit set-uid, giúp nâng cao quyền truy cập và kiểm soát an ninh hệ thống.

Câu lệnh này làm cho chương trình này trở thành chương trình root Set-UID.

Sau đó, bạn cần thêm các biến môi trường vào Bash Shell như PATH, LD_LIBRARY_PATH và một biến môi trường tùy ý để cấu hình hệ thống phù hợp Vì PATH và LD_LIBRARY_PATH đã có sẵn, bạn có thể khởi tạo một biến mới tên là hoangtran với giá trị /home/seed bằng lệnh export Việc này giúp đảm bảo các giá trị môi trường khác cũng được đồng bộ và hoạt động chính xác trong quá trình sử dụng.

Khi chạy chương trình đã biên dịch và lưu kết quả đầu ra trong tệp có tên envvarofchild, tiến trình con đã kế thừa biến môi trường PATH và HOANGTRAN nhưng không có biến môi trường LD, như đã xác nhận bằng việc tìm kiếm biến LD trong tệp không trả về giá trị nào Điều này cho thấy rằng quy trình con của chương trình SET-UID có thể không kế thừa đầy đủ tất cả các biến môi trường quan trọng.

Task 6: The PATH Environment variable and Set-UID programs

Chương trình shell gọi hàm hệ thống thông qua lệnh system() có thể gây nguy hiểm, đặc biệt khi sử dụng trong các chương trình có thuộc tính Set-UID Điều này là do hành vi của chương trình shell có thể bị ảnh hưởng bởi các biến môi trường như PATH, được cung cấp bởi người dùng, kể cả những người dùng xấu Thay đổi các biến môi trường này có thể giúp người dùng kiểm soát hành vi của chương trình Set-UID với mục đích xấu Để minh họa, ta sẽ biên dịch và thực thi chương trình ptsu.c, lưu kết quả vào tệp task6compiled, sau đó thay đổi quyền sở hữu thành root và chuyển nó thành chương trình Set-UID bằng các lệnh đã thực hiện trong nhiệm vụ trước.

Ta tiếp tục kiểm tra giá trị hiện tại của biến môi trường PATH và thư mục đang hoạt động của chương trình.

Chương trình này khi được thực thi sẽ hiển thị danh sách nội dung bên trong thư mục hiện tại, tương tự như lệnh ls Tuy nhiên, điểm khác biệt là khi sử dụng lệnh ls, các file sở hữu quyền root hoặc đã được gán chương trình Set-UID sẽ được đánh dấu, trong khi khi chạy định dạng /ptsu, chương trình chỉ thực hiện chức năng liệt kê mà không đánh dấu các file này.

Chúng ta tiến hành tấn công thư mục Lab06 bằng cách lợi dụng chương trình thay thế cho lệnh ls tiêu chuẩn Bằng cách thay đổi biến môi trường PATH và đặt đường dẫn tới tệp độc hại trước các thư mục khác, hệ thống sẽ ưu tiên thực thi tệp này khi gọi lệnh ls Quá trình này cho phép chúng ta kiểm soát hành vi của hệ thống, gây ra các cuộc tấn công độc hại một cách thuận lợi Dưới đây là bước thực hiện việc chỉnh sửa biến PATH để hướng hệ thống thực thi tệp độc hại trong thư mục Lab06.

Bạn cần tiến hành biên dịch chương trình với tên file là ls Khi chạy task6compiled, hệ thống sẽ thực thi chương trình ls tự viết của bạn thay vì lệnh ls mặc định của hệ điều hành Điều này giúp tùy biến và kiểm soát tốt hơn quá trình thực thi lệnh trong hệ thống của bạn Việc biên dịch chương trình đúng cách đảm bảo rằng chương trình của bạn hoạt động chính xác khi gọi bằng tên đã đặt, thay thế lệnh hệ thống mặc định.

Trong thư mục task6 chứa chương trình ls với quyền người dùng seed bình thường, cho thấy cách biến môi trường PATH có thể được thay đổi để trỏ đến thư mục độc hại và thực thi các chương trình do người dùng tạo ra, gây nguy hiểm Việc sử dụng hàm system() có thể tiềm ẩn rủi ro do nó bao gồm các biến shell và môi trường, đặc biệt khi chỉ định đường dẫn tương đối thay vì tuyệt đối, khiến hệ thống tìm kiếm chương trình trong thư mục tùy ý Thay đổi giá trị PATH thành thư mục chứa tệp độc hại cùng tên, kẻ tấn công có thể chạy mã độc với quyền gốc vì chương trình đó thuộc dạng SET-UID của chủ sở hữu Do đó, việc sử dụng đường dẫn tương đối và hàm system() trong các chương trình SET-UID có thể dẫn đến các cuộc tấn công nghiêm trọng, và để giảm thiểu rủi ro, người ta liên kết /bin/sh với trình bao khác để vượt qua cơ chế bảo mật của shell dash.

Task 7: The LD_PRELOAD environment variable and Set-UID Programs

Trong bài viết này, chúng tôi phân tích cách các chương trình Set-UID ảnh hưởng bởi một số biến môi trường như LD_PRELOAD, LD_LIBRARY_PATH và các biến LD_* khác, vì chúng tác động trực tiếp đến hành vi của trình liên kết động Trình liên kết động là thành phần quan trọng của hệ điều hành, có nhiệm vụ tải các thư viện chia sẻ từ bộ nhớ lưu trữ vào RAM và liên kết chúng với tệp thực thi trong quá trình chạy chương trình.

Trong Linux, ld.so hoặc ld-linux.so là trình liên kết động dành cho các loại nhị phân khác nhau LD_LIBRARY_PATH là danh sách các thư mục phân tách bằng dấu hai chấm, nơi hệ thống tìm kiếm thư viện trước khi truy cập vào thư mục tiêu chuẩn LD_PRELOAD cho phép người dùng chỉ định các thư viện chia sẻ bổ sung sẽ được tải trước tất cả các thư viện khác, hỗ trợ tùy chỉnh quá trình liên kết động Trong bài tập này, chúng ta tập trung nghiên cứu về LD_PRELOAD Đầu tiên, cần xây dựng một thư viện liên kết động bằng cách tạo file mylib.c, trong đó định nghĩa hàm sleep() ghi đè lên hàm cùng tên của libc hệ thống Quá trình biên dịch thực hiện bằng lệnh gcc -fPIC -g -c mylib.c, trong đó -fPIC tạo mã độc lập về vị trí phù hợp cho liên kết động, -g tạo thông tin gỡ lỗi, và -c để biên dịch tệp mã nguồn mà không liên kết.

Bảng bù đắp toàn cục (GOT - Global Offset Table) là phần của bộ nhớ chương trình máy tính dùng để điều chỉnh địa chỉ trong mã, giúp chương trình ELF chạy chính xác khi được tải vào bộ nhớ GCC sử dụng các lệnh như "gcc -shared -o filename mylib.o -lc" để tạo ra các tệp chia sẻ, trong đó "-shared" cho phép tạo đối tượng chia sẻ có thể liên kết với các thành phần khác để xây dựng tệp thực thi Điều này đảm bảo tính di động và hiệu quả trong quá trình thực thi của phần mềm.

Trong thư mục task7, bạn cần tạo một chương trình gọi hàm sleep() rồi biên dịch và chạy chương trình đó Khi thực thi, chương trình sẽ gọi hàm sleep() do chính nó định nghĩa, và in ra dòng chữ đã được lập trình sẵn, giúp người dùng dễ dàng quan sát quá trình hoạt động của hàm sleep().

Khi chạy cùng một chương trình trong các tình huống khác nhau, ta nhận thấy rằng trong một số trường hợp hàm sleep() trong thư viện không được gọi và thay vào đó hàm sleep() do hệ thống xác định đã được thực thi Để hiểu rõ hơn hành vi này, ta cần chỉnh sửa chương trình và thêm lệnh gọi hệ thống để kiểm tra các biến môi trường của quy trình bằng cách sử dụng env | grep LD Bởi vì cách duy nhất một chương trình tải thư viện tùy chỉnh đã xác định là thông qua biến môi trường LD_PRELOAD, điều này giải thích tại sao hàm sleep() tùy chỉnh không được gọi trong một số tình huống Chương trình myprogram.c đã được sửa đổi như sau để phù hợp với mục đích kiểm tra.

Trường hợp 1: Sau khi đã tiến hành chỉnh sửa thêm lệnh system(“env | grep

Trong quá trình thực thi lại, chương trình chạy với quyền người dùng thường và xuất ra dòng chứa hàm sleep() cùng các biến môi trường chứa chuỗi "LD" Điều này cho thấy tiến trình đã sử dụng biến môi trường LD_PRELOAD, khiến hệ thống không tải thư viện hoặc hàm sleep() do hệ thống xác định Việc thừa biến LD_PRELOAD dẫn đến việc không thể ghi đè hoặc nạp các hàm hệ thống như sleep(), gây ảnh hưởng đến hành vi của chương trình.

Trong trường hợp này, chương trình đã được thiết lập với chế độ SET-UID root, do đó chỉ cần đăng nhập vào tài khoản user root để kiểm tra biến LD_PRELOAD Khi chạy chương trình, người dùng có thể thấy rằng hàm sleep() được định nghĩa tùy chỉnh và biến LD_PRELOAD hiện diện, cho thấy khả năng khai thác chức năng này Điều này xảy ra vì người dùng đang ở trong tài khoản root và quyền sở hữu của hàm cũng thuộc về root, dẫn đến quá trình thực thi có cùng real ID và effective ID.

ID, do đó́ biến LD_PRELOAD không bị loại bỏ.

Tiếp theo, ta tạo một tài khoản user mới quochoang dựa trên tài khoản root.

Trường hợp 4: Ta tiến hành tạo một bản sao myprocompiled1 của myprogcompiled để hạn chế nhầm lẫn.

Biến LD_PRELOAD xuất hiện khi real ID và effective ID giống nhau, và bị loại bỏ khi chúng khác nhau, phản ánh cơ chế bảo mật của chương trình SET-UID Trong trường hợp chủ sở hữu và tài khoản người dùng thực thi tệp là cùng một người, LD_PRELOAD luôn tồn tại và thư viện do người dùng xác định được tải trước Ngược lại, khi effective ID là của người dùng root còn real ID là của người dùng seed, LD_PRELOAD sẽ bị loại bỏ và hệ thống sẽ gọi thư viện liên kết động lib.c cùng hàm sleep(), nhằm chống lại các cuộc tấn công dựa trên khai thác lỗ hổng của hệ thống UNIX.

Task 8: Gọi các chương trình bên ngoài bằng hàm system() và hàm execve()

Dù hệ thống() và execve() đều có thể dùng để chạy các chương trình mới, nhưng hệ thống() khá nguy hiểm khi sử dụng trong các chương trình đặc quyền như Set-UID Biến môi trường PATH ảnh hưởng lớn đến hành vi của hệ thống(), bởi vì nó tác động đến hoạt động của shell Trong khi đó, execve() không gặp phải vấn đề này vì không gọi shell, và việc gọi shell mang lại những rủi ro nguy hiểm khác, không liên quan đến các biến môi trường.

Trong tình huống này, Bob cần truy cập tất cả các tệp trong hệ thống Unix của công ty để điều tra hành vi gian lận, mà không làm thay đổi bất kỳ tệp nào để đảm bảo tính toàn vẹn của hệ thống Vince, trưởng hệ thống, đã tạo ra một chương trình đặc biệt có đặc quyền set-root-uid và cấp quyền thực thi cho Bob, cho phép anh truy cập dữ liệu nhạy cảm mà không cần quyền cao nhất Chương trình này cho phép Bob nhập tên tệp tại dòng lệnh, rồi chạy /bin/cat để hiển thị nội dung tệp đó, dựa trên quyền của người dùng root mà không thể sửa đổi tệp Việc này đảm bảo an toàn, vì chương trình không có chức năng ghi, giúp ngăn chặn khả năng sửa đổi dữ liệu trong quá trình điều tra.

Đầu tiên, tiến hành biên dịch và thực thi chương trình của Vince theo hướng dẫn của task để tạo ra file tên là task8compiled Sau đó, chuyển đổi chương trình thành quyền root và thiết lập chế độ Set-UID nhằm cho phép thực thi với quyền của người dùng khác, mở rộng khả năng sử dụng và kiểm soát của chương trình trong hệ thống.

Ta tạo ra một file text giả task8Test.txt.

Trong quá trình chạy chương trình task8compiled, hàm chức năng cơ bản của nó sẽ xuất ra nội dung của tệp được chỉ định Trong ví dụ này, chúng ta đã chỉ định tệp dummy text là task8Test.txt, tệp mà chúng ta vừa tạo để kiểm tra Việc này giúp kiểm tra chính xác nội dung và hoạt động của hàm trong quá trình xử lý dữ liệu.

Bob đang sử dụng tài khoản người dùng bình thường nhưng có thể khai thác lỗ hổng bảo mật khi cung cấp một đầu vào độc hại như "document; /bin/sh" Khi chương trình đọc nội dung tài liệu trước, lệnh "/bin/sh" sẽ được chạy dưới dạng lệnh hệ thống, cho phép Bob truy cập vào shell với đặc quyền root Điều này giúp Bob có thể thực hiện các lệnh như "rm" để xóa tệp như thể có quyền root, mặc dù anh ta chỉ có quyền người dùng bình thường Đây là một ví dụ về lỗ hổng thực thi lệnh mà không kiểm soát đầu vào một cách an toàn trong các chương trình xử lý tệp và lệnh hệ thống.

Vấn đề chính là lệnh gọi hệ thống bên trong chương trình không tách biệt rõ ràng giữa câu lệnh và input của người dùng Khi người dùng nhập dữ liệu, phần nhập cuối cùng thường bị hiểu nhầm là lệnh thay vì là tên dữ liệu hoặc tài liệu Điều này gây ra khó khăn trong xử lý và gây nhầm lẫn trong quá trình thực thi chương trình Để đảm bảo hoạt động chính xác, cần thiết phải phân chia rõ ràng giữa câu lệnh hệ thống và input của người dùng, giúp chương trình hiểu đúng ý định của người dùng.

Trong quá trình thử nghiệm, chúng tôi thấy rằng cuộc tấn công không thành công vì toàn bộ chuỗi người dùng nhập vào được coi là tên tệp thay vì tách chuỗi trên dấu ';' để làm tên tài liệu và lệnh như trước Nếu người dùng bỏ quên dấu ngoặc kép và chỉ nhập chuỗi, câu lệnh sẽ được thực thi mà không cần quyền của người dùng root, khiến Bob không thể ghi, sửa hoặc xóa Điều này xảy ra vì lệnh hệ thống được xây dựng từ các chuỗi đầu vào trong quá trình thực thi, và trong terminal, nhiều lệnh được nhập qua dấu ';', khiến phần thứ hai sau dấu này trở thành lệnh trực tiếp chứ không phải phần của tên tệp Trong khi đó, hàm system() không xác thực đầu vào, còn hàm execve() lại coi toàn bộ chuỗi nhập vào là tên tệp duy nhất, tránh được kiểu tấn công này bằng cách không nối các chuỗi để xây dựng lệnh.

Task 9: Capability Leaking

Các chương trình Set-UID thường từ bỏ vĩnh viễn các đặc quyền root khi không còn cần thiết, tuân theo Nguyên tắc Ít Ưu đãi (Principle of Least Privilege) Trong trường hợp cần giao quyền kiểm soát cho người dùng, các đặc quyền root phải được thu hồi để bảo vệ hệ thống Lệnh gọi hệ thống setuid() có thể được sử dụng để thu hồi các đặc quyền này một cách an toàn Theo hướng dẫn, “setuid() đặt effective,” giúp kiểm soát quyền truy cập của chương trình một cách chính xác và an toàn.

Trước tiên, ta tiến hành biên dịch và thực thi chương trình task9.c dưới đây, gắn quyền root cho chương trình và chuyển nó́ thành chương trình Set-UID.

Chúng tôi đã tạo thành công một tệp trống tên là zzz trong thư mục /etc Khi chạy task9, hệ thống sẽ kiểm tra sự tồn tại của tệp này và hiển thị dữ liệu bên trong, giúp xác nhận quá trình hoạt động đang diễn ra chính xác Nội dung của tệp zzz được cập nhật tự động bằng cách thêm thông tin từ tiến trình con, đảm bảo dữ liệu được ghi nhận đầy đủ và chính xác.

Chạy chương trình và kiểm tra nội dung của tệp zzz cho thấy nội dung đã được sửa đổi, thể hiện rằng tệp vẫn còn mở với các đặc quyền đặc biệt ngay cả khi không còn quyền phù hợp Sau khi gọi fork, quyền kiểm soát chuyển sang tiến trình con, cho phép người dùng độc hại chỉnh sửa nội dung tệp đặc quyền thành công Điều này nhấn mạnh tầm quan trọng của việc đóng trình mô tả tệp sau khi loại bỏ các đặc quyền để đảm bảo tệp chỉ còn các quyền thích hợp, ngăn chặn các truy cập trái phép.

Ngày đăng: 14/12/2022, 10:24

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w