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đ
Trang 1BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA: AN TOÀN THÔNG TIN
Giảng viên hướng dẫn: PGS.TS Lương Thế Dũng
Sinh viên thực hiện: Trần Quốc Hoàng
Trang 2BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA: AN TOÀN THÔNG TIN
THỰC TẬP CƠ SỞ CHUYÊN NGÀNH
AN TOÀN PHẦN MỀM
NGHIÊN CỨU ENVIROMENT VARIABLE AND SET-UID (ENVIROMENT VARIABLE AND SET-UID LAB)
Nhận xét của giáo viên hướng dẫn:
Điểm báo cáo:
Xác nhận của giáo viên hướng dẫn:
2 download by : skknchat@gmail.com
Trang 3LỜI CẢM ƠN
Chúng em xin chân thành cảm ơn PGS.TS Lương Thế Dũng– giảng viên trựctiếp hướng dẫn, chỉ bảo, tạo mọi điều kiện thuận lợi giúp đỡ chúng em trong quá trìnhthực hiện đề tài
Để có được thành quả như ngày hôm nay, ngoài sự nỗ lực không ngừng nghỉ củacác thành viên trong nhóm thì một phần không nhỏ đóng góp nên thành công này là nhờ
sự quan tâm, chỉ bảo, giúp đỡ của các thầy cô, các anh chị khóa trên và bạn bè xungquanh
Tuy đã có rất nhiều cố gắng và sự nỗ lực của các thành viên để hoàn thiện đề tài, nhưng
chắc chắn đề tài “NGHIÊN CỨU ENVIROMENT VARIABLE AND SET-UID (ENVIROMENT VARIABLE AND SET-UID LAB)” của chúng em còn nhiều thiếu sót.
Chúng em rất mong nhận được sự góp ý từ các thầy giáo để nhóm em có thể hoàn thiện tốt hơncác đề tài nghiên cứu sau
Chúng em xin chân thành cảm ơn!
Trang 4LỜI MỞ ĐẦU
Ngày nay, với xu hướng chuyển đổi số mạnh mẽ của các doanh nghiệp, công ty, tổchức dẫn đến việc tạo ra những phần mềm quản lý, điều hành và làm việc cũng hết sứcthiết yếu Bên cạnh đó, ảnh hưởng của đại dịch COVID-19 cũng đã thúc đẩy nhanh việcchuyển đổi số Để đảm bảo an toàn cho phần mềm khi tạo ra và vận hành tránh bị kẻ xấutấn công gây thiệt hại nghiêm trọng Đó cũng là lý do để chúng em chọn chuyên đềSoftware Security và đặc biệt là nghiên cứu tìm hiểu bài lab Enviroment Variable andSet-UID
4download by : skknchat@gmail.com
Trang 5MỤC LỤC
LỜI CẢM ƠN 3
LỜI MỞ ĐẦU 4
MỤC LỤC 5
CHƯƠNG I: TỔNG QUAN VỀ ENVIRONMENT VARIABLES VÀ SET-UID PROGRAM 6
1.1 Environment Variables 6
1.2 Set-UID Program 6
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 LAB THEO THỨ TỰ TỪNG TASK 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 28
2.7 Task 7: The LD_PRELOAD environment variable and Set-UID Programs 31
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() 37
2.9 Task 9: Capability Leaking 41
CHƯƠNG III: KẾT LUẬN 43
TÀI LIỆU THAM KHẢO 44
Trang 6CHƯƠNG I: TỔNG QUAN VỀ ENVIRONMENT VARIABLES
VÀ SET-UID PROGRAM
1.1 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đến quá trình thực thi của một ứng dụng, nếu như ứng dụng sử dụng các biến môi trườngđó
Biến môi trường được giới thiệu ở dạng hiện đại vào năm 1979 với Version 7Unix, do đó được bao gồm trong tất cả các phiên bản và phiên bản hệ điều hành Unix từthời điểm đó trở đi, bao gồm cả Linux và macOS Từ PC DOS 2.0 vào năm 1982, tất cảcác hệ điều hành kế nhiệm của Microsoft, bao gồm cả Microsoft Windows và OS / 2cũng đã bao gồm chúng như một tính năng, mặc dù với cú pháp, cách sử dụng và tên biếntiêu chuẩn có phần khác nhau
Vậy tại sao chúng ta cần thiết lập các biến môi trường? Ví dụ Suy nghĩ một chút,
sẽ rất dễ dàng để hiểu lý do Hiện tại, các developer đang sử dụng github như một công
cụ hữu ích để quản lý code của dự án Các thao tác trên git giúp người quản lý có thể dễdàng kiểm soát tiến trình của dự án đang đến đâu để lên kế hoạch, hoặc dễ dàng chia sẻcode với những thành viên mới gia nhập nhóm phát triển Tuy nhiên, chính vì việc dễdàng chia sẻ với thành viên mới cũng chính là việc những người khác không mong muốncó thể đọc được hết code của bạn, ngay cả các thông tin về tài khoản email hay các APIkey của riêng bạn nữa Để khắc phục vấn đề này, chúng ta sử dụng các biến mỗi trườngđược thiết lập trên mỗi máy là khác nhau để bạn có thể sử dụng tài khoản cá nhân màkhông cần chia sẻ các thông tin đó
1.2 Set-UID Program
Set-UID (SET User ID upon execution), là một loại đặc quyền file (filepermission) đặc biệt, có thể cho phép user tạm có quyền thực thi file bằng chính quyềncủa người sở hữu (owner) để thay đổi hành vi của file thực thi đó Hay nói một cách đơngiản hơn: “Thông thường một file trong linux khi chạy thì sẽ được kế thừa quyền từ userđang login SETUID sẽ cấp quyền “tạm thời” cho user chạy file quyền của user tạo ra file(owner user) Nói một cách khác, user chạy sẽ có UID và GID của người tạo ra file, khichạy 1 file hay command.”
6download by : skknchat@gmail.com
Trang 71.3 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 cách các biến môi trườngảnh hưởng đến chương trình và hành vi của hệ thống Mặc dù các biến môi trường ảnhhưởng đến các hành vi của chương trình, nhưng cách chúng hoạt động thì không đượcnhiều lập trình viên hiểu rõ Kết quả là, nếu một chương trình sử dụng các biến môitrường, các chương trình có thể có lỗ hổng Qua bài lab này, sẽ hiểu rõ cách vận hành củacác biến môi trường, cách chúng được đề xuất từ quy trình mẹ sang quy trình con, vàcách chúng ảnh hưởng đến các chương trình/ hệ thống Đặc biệt quan tâm đến cách cácbiến môi trường ảnh hưởng đến hoạt động của các chương trình Set-UID, thường là cácchương trình đặc quyền
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
Trang 8Tiếp tục , chọn Next và cuối cùng là chọn Install
8download by : skknchat@gmail.com
Trang 9Chọ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
Trang 101.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
Ở đây em chọn đường dẫn của “Google Drive” Sau khi tải xong chúng ta giải nénfile rar
10download by : skknchat@gmail.com
Trang 11Quay 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 Add
Trang 12Chọ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
12download by : skknchat@gmail.com
Trang 13Sau đó ấn Create
Chọn Start để tiến hành cài đặt bên trong
Trang 14Quá trình cài đặt hoàn tất
14download by : skknchat@gmail.com
Trang 15Lư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
Trang 16CHƯƠNG II: TIẾN HÀNH THỰC HIỆN VÀ NGHIÊN CỨU CHUYÊN SÂU BÀI LAB THEO THỨ TỰ TỪNG TASK
2.1. Task 1: Thao tác với các biến môi trường
Trong task này, chúng ta nghiên cứu về các câu lệnh có thể được sử dụng để đặt và
gỡ các biến môi trường Chúng ta đang sử dụng Bash trong tài khoản seed Shell mặcđịnh mà người dùng sử dụng được đặt trong tệp /etc/passwd
Trước khi bắt đầu làm việc, để kiểm tra shell mặc định cấu hình cho tài khoảnseed, ta thực thi câu lệnh:
seed@VM:~$ cat /etc/passwdTìm trong các output của lệnh thực thi, tìm tới tài khoản seed, shell mặc định là bash, như được thấy trong trường cuối cùng là:
seed:x:1000:1000:seed,,,:/home/seed:/bin/bash
Đầu tiên, để hiển thị ra toàn bộ các biến môi trường, sử dụng câu lệnh printenv
Kết quả đầu ra cho thấy các biến môi trường chỉ là các cặp variable = value Bên cạnhcâu lệnh printenv, để hiển thị toàn bộ các biến cũng có thể dùng lệnh env
16download by : skknchat@gmail.com
Trang 17Ngoài ra, nếu cần hiển thị các biến môi trường chỉ định, ví dụ như PWD thì tacũng có thể dùng lệnh printenv PWD thì sẽ chỉ hiển thị ra giá trị của biến PWD Để nhằmmục đích tìm ra các biến liên quan bao gồm các chuỗi con ta dùng lệnh env | grep PWD,
lúc này sẽ hiển thị ra toàn bộ các biến và giá trị có chứa PWD như chuỗi con bên trongchúng
Tiếp theo, để đặt và gỡ các biến môi trường ta dùng cặp lệnh “export” và “unset”
Ta cần phải lưu ý rằng hai câu lệnh này không phải hai chương trình riêng biệt Cả hai chỉcó mức phạm vi hoạt động trong Bash (nếu ta ra khỏi shell mặc định này thì các biến môitrường được set sẽ không hiển thị) Ví dụ: để đặt biến môi trường SEEDAGE với giá trịcủa biến là 5 ta dùng câu lệnh:
seed@VM:~$ export SEEDAGE=5
Để gỡ biến môi trường này ta dùng câu lệnh:
seed@VM:~$ unset SEEDAGE
Như trên, ta cần lưu ý các biến môi trường này chỉ được set trong shell cố định,nếu thoát hoặc chuyển ra shell khác thì các biến môi trường này sẽ không được hiển thị
Trang 182.2. Task 2: Kế thừa các biến môi trường từ quy trình cha sang quy trình con
Trong task này, chúng ta sẽ nghiên cứu về cách các biến môi trường được các tiếntrình con kế thừa từ các tiến trình cha của chúng Trong Unix, hàm fork () tạo ra một quytrình mới bằng cách sao chép quy trình gọi Quy trình mới, được gọi là con, là một bảnsao chính xác của quy trình gọi, được gọi là quy trình cha; tuy nhiên, một số thứ khôngđược kế thừa cho quy trình con (vui lòng xem hướng dẫn của fork () bằng cách gõ lệnh
man fork Trong task này, chúng ta cần biết các biến môi trường của quy trình cha mẹ có
kế thừa cho quy trình con hay không
Nội dung của file output child p2cc của chương trình p2c.c chứa quy trình conhiển thị tất cả các biến môi trường của tiến trình con
Nội dung của file output parent p2cp của chương trình p2c.c sao khi bỏ commentcủa quy trình cha và thêm comment vào phần quy trình con Tiến trình này đưa ra outputvới lệnh printenv có kết quả tương tự tiến trình p2cc
18download by : skknchat@gmail.com
Trang 19Các tệp sau được tạo do các tác vụ trên:
p2c.c Chương trình chính của task trên
p2cc Tệp thực thi với tiến trình printenv của child processp2cp Tệp thực thi với tiến trình printenv của parent processchild File output của child process
parent File output của parent process
Trang 20Sau đây, là các lệnh từng bước để compile và chạy chương trình child process, sauđó comment vào child và compile và chạy parent process, gán output vào file child vàparent tương ứng Để so sánh sự khác nhau giữa 2 file output ta dùng câu lệnh:
seed@VM:~/ /labEV$ diff child parent
Đầu ra của câu lệnh diff này được hiểu như sau:
67c67 có nghĩa là ở dòng thứ 67 (bên trái) trong tệp bên trái được thay đổi thànhdòng thứ 67 (bên phải) trong tệp bên phải, trong đó c là viết tắt của sự thay đổi và các sốbên trái và bên phải cho biết số dòng <_=./p2cc biểu thị các dòng bên trái; >=./p2cp biểuthị các dòng bên phải thay đổi
Điều này cho thấy rằng biến môi trường _ nhận giá trị của lệnh cuối cùng đượcthực thi, ở đây là lệnh thực hiện chương trình Nó được coi là một biến shell đặc biệt vàchứa các giá trị khác nhau tùy thuộc vào từng tình huống
Điều này cho thấy rằng biến _ môi trường thay đổi tùy thuộc vào chương trình đãbiên dịch đang được chạy nhưng khác với điều đó là không có thay đổi trong các biếnmôi trường Nếu cả hai chương trình được biên dịch thành một tệp có cùng tên, sẽ khôngcó bất kỳ sự khác biệt nào giữa đầu ra của tiến trình cha và con
Vậy ta có thể đưa ra kết luận, các biến môi trường của quy trình cha được kế thừacho quy trình con, ngoại trừ một biến đó là giá trị tên của chương trình
20download by : skknchat@gmail.com
Trang 212.3 Task 3: Biến môi trường và hàm execve()
Trong task này, chúng ta nghiên cứu về cách các biến môi trường bị ảnh hưởngnhư thế nào khi một chương trình được thực thi thông qua execve() Hàm execve() gọimột lệnh gọi hệ thống để tải một lệnh mới và thực thi nó; hàm này sẽ không trả về.Không có quy trình mới nào được tạo ra; thay vào đó, văn bản, dữ liệu, bss và ngăn xếpcủa quá trình gọi bị ghi đè bởi chương trình đã tải Về cơ bản, exevec() chạy chương trìnhmới bên trong quá trình gọi Chúng ta sẽ tìm hiểu những gì xảy ra với các biến môitrường; chúng có tự động được kế thừa bởi chương trình mới hay không?
Đầu tiên, ta sẽ cho biên dịch và thực thi chương trình envex.c trên đây thành cácoutput tương ứng và output này sẽ được lưu trữ trong file beforeeditoutput
Như ta quan sát thấy output của chương trình này là rỗng
Trang 22Tiế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 outputtươ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
22download by : skknchat@gmail.com
Trang 23Giải thích cho điều này là mặc dù biến môi trường chung đã được chỉ định trongchương trình, chương trình trước đó chứa NULL là đối số thứ ba của trình thực thi vàchương trình afteredit chứa biến môi trường là đối số thứ ba của trình thực thi Thay đổinày ảnh hưởng đến kết quả đầu ra của chương trình vì đối số thứ ba của hàm execute ()chỉ định biến môi trường của tiến trình hiện tại Vì biến môi trường không được thôngqua trong chương trình ban đầu và do đó không có biến môi trường nào được liên kết vớiquy trình mới này, kết quả đầu ra là null Nhưng sau khi chỉnh sửa chương trình, ta đãchuyển biến môi trường làm đối số thứ ba để thực thi, nó chứa tất cả các biến môi trườngcủa quy trình hiện tại, kết quả đầu ra của chương trình có tất cả các biến môi trường, nhưmong đợi Kết luận, đối số thứ ba của lệnh execute () nhận các biến môi trường củachương trình.
Trang 242.4 Task 4: Biến môi trường và hàm system ()
Trong task này, chúng ta nghiên cứu các biến môi trường bị ảnh hưởng như thếnào khi một chương trình mới được thực thi thông qua hàm system () Hàm này được sửdụng để thực thi một lệnh, nhưng không giống như execute (), trực tiếp thực thi một lệnh,system () thực sự thực thi "/bin/sh -c command", tức là, nó thực thi /bin/sh và yêu cầushell thực hiện lệnh
Nếu ta nhìn vào quá trình thực thi của hàm system (), bạn sẽ thấy rằng nó sử dụngexecutel () để thực hiện /bin/sh; excel () gọi execve (), truyền cho nó mảng các biến môitrường Do đó, bằng cách sử dụng hàm system (), các biến môi trường của quá trình gọiđược chuyển tới chương trình mới /bin/sh Đầu tiên ta sẽ biên dịch và chạy chương trìnhcallsys.c dưới đây và quan sát
Chương trình được biên dịch và thực thi và như đã thấy, mặc dù chúng ta khônggửi rõ ràng bất kỳ biến môi trường nào trong chương trình, nhưng kết quả đầu ra vẫn hiểnthị biến môi trường của quy trình hiện tại Điều này xảy ra bởi vì hàm system() chuyểnngầm các biến môi trường đến hàm /bin/sh được gọi
24download by : skknchat@gmail.com
Trang 252.5 Task 5: Các biến môi trường và Set-UID program
Đầu tiên, nhắc lại Set-UID là gì? Set-UID là một cơ chế bảo mật quan trọng trong
hệ điều hành Unix Khi chương trình Set-UID chạy, chương trình đó sẽ thừa nhận các đặcquyền của chủ sở hữu Ví dụ: nếu chủ sở hữu của chương trình là root, thì khi bất kỳ aichạy chương trình này, chương trình sẽ nhận được các đặc quyền của root trong quá trìnhthực thi Set-UID cho phép chúng tôi làm nhiều điều thú vị, nhưng nó làm tăng đặc quyềncủa người dùng khi thực thi, khiến nó trở nên khá rủi ro Mặc dù các hành vi của cácchương trình Set-UID được quyết định bởi logic chương trình của họ, không phải bởingười dùng, người dùng thực sự có thể ảnh hưởng đến các hành vi thông qua các biếnmôi trường Để hiểu các chương trình Set-UID bị ảnh hưởng như thế nào, trước tiênchúng ta hãy tìm hiểu xem các biến môi trường có được quy trình của chương trình Set-UID kế thừa từ quy trình của người dùng hay không
Tiếp theo, ta tiến hành biên dịch và chạy chương trình envsu.c dưới đây