Tải bản đầy đủ (.pdf) (46 trang)

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)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.08 MB, 46 trang )

BAN CƠ YẾU CHÍNH PHỦ
HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA: AN TỒN THƠNG TIN


THỰC TẬP CƠ SỞ CHUN NGHÀNH
AN TỒN PHẦN MỀM

NGHIÊN CỨU ENVIROMENT VARIABLE AND SET-UID
(ENVIROMENT VARIABLE AND SET-UID LAB)
……………………………………………………………………………………………..

Giảng viên hướng dẫn:
Sinh viên thực hiện:
Lớp:
Mã số sinh viên:
Nhóm:
Khóa:

PGS.TS Lương Thế Dũng
Trần Quốc Hồng
AT15H
AT150719
13
2018-2023

TP. Hồ Chí Minh, tháng 11 năm 2021
1


BAN CƠ YẾU CHÍNH PHỦ


HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA: AN TỒN THƠNG TIN


THỰC TẬP CƠ SỞ CHUN NGÀNH
AN TỒ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


LỜ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ực
tiế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 q trình
thực hiện đề tài.
Để có được thành quả như ngày hơm nay, ngồi sự nỗ lực khơng ngừng nghỉ của
cá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è xung
quanh.

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ể hồn thiện tốt hơn
các đề tài nghiên cứu sau.
Chúng em xin chân thành cảm ơn!

3


LỜ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ức
thiết yếu. Bên cạnh đó, ảnh hưởng của đại dịch COVID-19 cũng đã thúc đẩy nhanh việc
chuyể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ấu
tấ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 and
Set-UID.

4


MỤ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 ngồ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

5


CHƯƠ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 7
Unix, 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 / 2
cũ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ến
tiê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 số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ốn
có 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 API
key 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 (file
permission) đặc biệt, có thể cho phép user tạm có quyền thực thi file bằng chính quyền
củ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 đơn
giả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, khi
chạy 1 file hay command.”

6


1.3.

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

1.4.

Chuẩn bị cho bài 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 ảnh
hưở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 được
nhiề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ơi
trườ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ủa
cá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ác
biế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ác
chương trình đặc quyền.

đặt

Truy cập đường link: . Để tải và cài

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


7


Tiếp tục , chọn Next và cuối cùng là chọn Install

8


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
9


1.5.

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

Truy cập vào trang web : . Chọn version
16.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én
file rar.
10


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 Add
11


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.

12


Sau đó ấn Create

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

13


Q trình cài đặt hồn tất .

14


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.


15


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
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ản
seed, ta thực thi câu lệnh:
seed@VM:~$ cat /etc/passwd
Tì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 tồ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ạnh
câu lệnh printenv, để hiển thị toàn bộ các biến cũng có thể dùng lệnh env.

16


Ngồi ra, nếu cần hiển thị các biến mơi trường chỉ định, ví dụ như PWD thì ta
cũng có thể dùng lệnh printenv PWD thì sẽ chỉ hiển thị ra giá trị của biến PWD. Để nhằm
mụ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 tồn bộ các biến và giá trị có chứa PWD như chuỗi con bên trong

chú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ơi
trườ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ị.

17


2.2.

con

Task 2: Kế thừa các biến môi trường từ quy trình cha sang quy trình

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ến
trì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 quy
trì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ản
sao 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 con
hiể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ỏ comment
củ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 output
với lệnh printenv có kết quả tương tự tiến trình p2cc.
18


Cá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 process

p2cp

Tệp thực thi với tiến trình printenv của parent process

child

File output của child process

parent

File output của parent process


19


Sau đâ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ành
dò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ểu
thị 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 được
thự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ến
mơ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ơng
có 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ừa
cho quy trình con, ngoại trừ một biến đó là giá trị tên của chương trình.

20


2.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ưởng
như thế nào khi một chương trình được thực thi thông qua execve(). Hàm execve() gọi
mộ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ếp
củ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ình
mớ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ơi
trườ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ác
output 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.

21


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.

22


Giải thích cho điều này là mặc dù biến mơi trường chung đã được chỉ định trong
chươ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 đổi

nà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ơng
qua 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ới
quy 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ường
củ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ủa
chương trình.

23


2.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ầu
shell 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ụng
executel () để thực hiện /bin/sh; excel () gọi execve (), truyền cho nó mảng các biến mơi
trường. Do đó, bằng cách sử dụng hàm system (), các biến mơi trường của q 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ình
callsys.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ông
gử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ển
thị 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ển

ngầm các biến môi trường đến hàm /bin/sh được gọi.
24


2.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 đặc
quyề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ỳ ai
chạ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ình
thự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ền
củ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ác
chương trình Set-UID được quyết định bởi logic chương trình của họ, khơng phải bởi
ngườ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ến
mơi trường. Để hiểu các chương trình Set-UID bị ảnh hưởng như thế nào, trước tiên
chú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 SetUID 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.

25


×