Symlink
Symlink
Symlink (viết tắt của "symbolic link", còn được gọi là "soft link") trên Linux là một loại tệp đặc biệt hoạt động như một tham chiếu hoặc con trỏ đến một tệp hoặc thư mục khác. Khi bạn truy cập vào một symlink, hệ thống sẽ tự động chuyển bạn đến tệp hoặc thư mục mà symlink trỏ tới. Symlink gần tương tự shortcut trên Windows
Đặc điểm của Symlink:
Symbolic link chỉ là một tệp chứa đường dẫn đến một tệp hoặc thư mục khác.
Khác với Hard Link: Symlink chỉ là một tham chiếu đến tệp hoặc thư mục khác, không trực tiếp lưu trữ nội dung của tệp như Hard Link. Hardlink không thể trỏ đến thư mục hay không thể trỏ đến tệp trên thiết bị khác
Linh hoạt: Bạn có thể tạo symlink đến tệp hoặc thư mục ở bất kỳ vị trí nào trên hệ thống, thậm chí trên các ổ đĩa khác nhau.
Dễ bị "hỏng": Nếu tệp hoặc thư mục mà symlink trỏ tới bị xóa hoặc di chuyển, symlink sẽ bị "hỏng" và trở nên không khả dụng (hay còn gọi là "broken symlink").
Cách tạo Symlink:
Lệnh ln
được sử dụng để tạo symlink trên Linux. Cú pháp cơ bản như sau:
-s
: Tùy chọn để tạo một symbolic link.<đường_dẫn_đích>
: Đường dẫn đến tệp hoặc thư mục mà bạn muốn tạo symlink tới.<tên_symlink>
: Tên của symlink sẽ được tạo.
Ví dụ tạo Symlink:
Tạo symlink đến một tệp:
Giả sử bạn có một tệp tên là
file.txt
trong thư mục/home/user/documents
, và bạn muốn tạo một symlink đến tệp này tại/home/user/desktop
với tên làlink_to_file.txt
:Tạo symlink đến một thư mục:
Bạn có một thư mục tên là
projects
trong/home/user/
và muốn tạo một symlink đến thư mục này trong/home/user/desktop
với tênlink_to_projects
:
Quản lý Symlink:
Xem thông tin symlink: Bạn có thể dùng lệnh
ls -l
để xem chi tiết các symlink trong một thư mục. Symlink sẽ được hiển thị với một mũi tên (->
) chỉ đến tệp hoặc thư mục mà nó trỏ tới.Xóa symlink: Để xóa một symlink, bạn chỉ cần dùng lệnh
rm
với tên của symlink đó.Broken Symlink: Nếu bạn xóa hoặc di chuyển tệp/thư mục gốc mà symlink trỏ tới, symlink sẽ bị hỏng. Bạn có thể xác định các symlink bị hỏng bằng cách sử dụng lệnh
find
:
Tấn công Symlink
Một số đặc điểm để khai thác:
Hard Links và Symlinks: Cả hard links và symlinks đều có thể được tạo bởi bất kỳ người dùng nào và có thể trỏ đến bất kỳ tệp hoặc thư mục nào (trong trường hợp của symlinks). Người tạo liên kết chỉ cần quyền cần thiết trong thư mục mà họ tạo liên kết, mà không cần quyền đặc biệt trên tệp mục tiêu.
Quyền Truy Cập: Quyền đọc, ghi hoặc thực thi tệp mục tiêu vẫn được xác định bởi inode của tệp mục tiêu, và người tạo liên kết không nhận được quyền truy cập mới nào từ việc tạo liên kết
Tạo Tệp Mới: Khi một chương trình muốn tạo tệp, nó thường sử dụng cờ
O_CREAT
với lệnhopen()
. Cờ này yêu cầuopen()
tạo tệp nếu nó chưa tồn tại. Nếu tệp đã tồn tại, không có lỗi nào được trả về và tệp hiện có sẽ được mở. Ví dụ: chức năngfopen()
trong thư viện C với chế độ "w" (viết) hoặc "a" (thêm) sẽ hoạt động theo cách này.Theo Dõi Symlink: Khi
open()
gặp một symlink với mục tiêu không tồn tại, nó sẽ theo dõi đường dẫn của symlink trước khi thực hiện các hành động khác. Nó sẽ chuyển đổi đường dẫn thành mục tiêu của symlink, sau đó kiểm tra xem tệp đã tồn tại hay chưa và tạo nó nếu cần. Do hành vi này,open()
có thể tạo ra tệp mục tiêu mà kẻ tấn công muốn, nếu mục tiêu của symlink không tồn tại.
Ví Dụ Về Khai Thác
Khi các chương trình có đặc quyền (privileged programs) tạo tệp trong các thư mục có thể ghi bởi người dùng kém đặc quyền, chúng có thể vô tình mở một symlink được tạo bởi kẻ tấn công. Ví dụ điển hình là việc tạo tệp tạm thời trong thư mục /tmp
, mà mọi người đều có quyền ghi. Nếu chương trình tạo tệp tạm thời với tên dự đoán được và không kiểm tra xem tệp đã tồn tại hay chưa, nó có thể mở một symlink do kẻ tấn công tạo ra. Kẻ tấn công có thể lợi dụng điều này để chương trình hoạt động trên mục tiêu của symlink, có thể là bất kỳ tệp nhạy cảm nào mà kẻ tấn công muốn.
Một cách tấn công khác:
Kẻ tấn công, sau khi đã có quyền truy cập vào một tài khoản người dùng trên máy chủ chia sẻ, có thể sử dụng hàm symlink()
trong các ngôn ngữ lập trình như PHP để tạo một liên kết tượng trưng từ thư mục người dùng đến thư mục gốc của máy chủ.
Ví dụ lệnh PHP:
Phân tích cú pháp:
symlink(a, b)
là một hàm tạo một liên kết tượng trưng từ thư mục đícha
(trong trường hợp này là thư mục gốc/
) đến liên kết tượng trưngb
(trong trường hợp này là thư mục ẩn./forroot
).Điều này tạo ra một liên kết tượng trưng trong thư mục của kẻ tấn công, trỏ đến thư mục gốc của máy chủ, cho phép họ truy cập trái phép vào các tệp và thư mục nhạy cảm.
Quá Trình Khai Thác:
Sau khi tạo được liên kết tượng trưng, kẻ tấn công có thể điều hướng đến thư mục ẩn trong thư mục người dùng của họ.
Bằng cách chạy các lệnh như
ls -la
, kẻ tấn công có thể liệt kê nội dung của thư mục gốc, xem các tệp, và có thể thu thập thông tin về cấu trúc và bảo mật của hệ thống.Nếu máy chủ web không được cấu hình bảo mật đúng cách, kẻ tấn công có thể tiếp tục truy cập các tệp trên máy chủ thông qua trình duyệt web hoặc các lệnh hệ thống khác.
Một số CVE Liên Quan Đến Tấn Công Symlink
1. CVE-1999-1187
Tóm Tắt: Lỗi bảo mật trong PINE, một trình đọc email cũ, liên quan đến việc tạo tệp tạm thời trong thư mục
/tmp
với tên tệp dự đoán được và quyền ghi cho mọi người.Chi Tiết:
Vấn Đề: PINE tạo tệp tạm thời với tên dự đoán trước và thiết lập quyền ghi cho tất cả người dùng.
Khai Thác: Kẻ tấn công có thể tạo symlink với tên tệp tạm thời, trỏ đến một tệp nhạy cảm trong thư mục của nạn nhân (ví dụ:
.rhosts
). Khi nạn nhân sử dụng PINE, chương trình có thể ghi vào symlink đó, dẫn đến việc kẻ tấn công có thể chỉnh sửa tệp nhạy cảm và truy cập trái phép.
2. CVE-1999-1091
Tóm Tắt: Lỗi trong tin, một trình đọc tin tức, liên quan đến việc tạo tệp log với quyền ghi cho tất cả người dùng.
Chi Tiết:
Vấn Đề: tin tạo một tệp log (
/tmp/.tin
) mà không kiểm tra sự tồn tại của nó trước, và thiết lập quyền đọc-ghi cho mọi người.Khai Thác: Kẻ tấn công có thể tạo một symlink với tên tệp log và trỏ đến một tệp nhạy cảm, dẫn đến việc chương trình có thể ghi vào tệp nhạy cảm hoặc làm hỏng nó.
Hậu Quả: Có thể dẫn đến việc thay đổi tệp quan trọng hoặc làm hỏng các tệp hệ thống.
3. CVE-2020-8019
Tóm Tắt: Lỗi trong gói
syslog-ng
, liên quan đến việc tạo tệp log trong thư mục/var/log/news/
mà không kiểm tra sự tồn tại của tệp.Chi Tiết:
Vấn Đề: Tập lệnh cài đặt của
syslog-ng
tạo tệp/var/log/news/news.err
và thay đổi quyền sở hữu của nó thànhnews:news
.Khai Thác: Nếu thư mục
/var/log/news/
có thể ghi bởi người dùngnews
, kẻ tấn công có thể tạo một symlink trỏ đến/etc/shadow
, tệp chứa mật khẩu mã hóa. Khi cài đặt gói, tập lệnh sẽ thay đổi quyền sở hữu của tệp symlinked, cho phép kẻ tấn công đọc hoặc thay đổi tệp nhạy cảm.Hậu Quả: Có thể đọc hoặc thay đổi mật khẩu của các tài khoản người dùng, hoặc bắt đầu tấn công từ điển vào các mật khẩu yếu.
4. CVE-2021-25321
Tóm Tắt: Lỗi trong daemon
arpwatch
trên SUSE Linux, liên quan đến việc thay đổi quyền sở hữu của thư mục và tệp trong/var/lib/arpwatch
.Chi Tiết:
Vấn Đề:
arpwatch
mở giao diện mạng trong chế độ raw với quyền root, sau đó giảm quyền sở hữu tệp/var/lib/arpwatch/arp.dat
cho một người dùng không phải root.Khai Thác: Kẻ tấn công có thể thay đổi quyền sở hữu của thư mục
/var/lib/arpwatch
, sau đó xóa tệparp.dat
và tạo một symlink trỏ đến/etc/shadow
. Khiarpwatch
khởi động lại, nó sẽ thay đổi quyền sở hữu của symlink, cho phép kẻ tấn công sở hữu tệp nhạy cảm như/etc/shadow
.Hậu Quả: Có thể chiếm quyền sở hữu các tệp nhạy cảm như
/etc/shadow
, dẫn đến việc đọc hoặc thay đổi mật khẩu.
5. CVE-2022-35631
Tóm Tắt: Lỗi trong Velociraptor, một công cụ phân tích và phản ứng sự cố, liên quan đến việc tạo tệp tạm thời với tên dự đoán từ cấu hình.
Chi Tiết:
Vấn Đề: Velociraptor client tạo tệp tạm thời với tên dự đoán và có thể không kiểm tra sự tồn tại của nó.
Khai Thác: Kẻ tấn công có thể tạo một symlink với tên tệp tạm thời, trỏ đến một tệp nhạy cảm. Khi Velociraptor client chạy, nó có thể ghi vào tệp nhạy cảm thông qua symlink.
Hậu Quả: Có thể dẫn đến việc truy cập hoặc thay đổi các tệp nhạy cảm hoặc hệ thống.
Các Biện Pháp Bảo Vệ Chống Symlink Attack
1. Kiểm Tra Tệp:
Vấn Đề: Khi một chương trình tạo tệp, thường nó sẽ kiểm tra sự tồn tại của tệp trước. Ví dụ, một chương trình có thể sử dụng
stat()
để kiểm tra xem tệp có tồn tại hay không, và nếu không có, nó sẽ tạo tệp bằngopen()
. Tuy nhiên, giữa hai cuộc gọi này có thể xảy ra điều kiện đua, trong đó một kẻ tấn công có thể tạo một symlink trong khoảng thời gian đó. Điều này dẫn đến việc chương trình có thể thao tác trên symlink thay vì tệp thực sự mà nó dự định.Giải Pháp: Để bảo vệ khỏi điều này, sử dụng cờ
O_EXCL
cùng vớiO_CREAT
trong hàmopen()
. CờO_EXCL
đảm bảo rằng hàmopen()
sẽ kiểm tra xem tệp đã tồn tại chưa và nếu đã tồn tại, nó sẽ trả về lỗi thay vì mở tệp. Cách này ngăn ngừa các cuộc tấn công symlink vì nếu tệp hoặc symlink tồn tại, hàm sẽ không tạo tệp mới.Lưu Ý: Cách này cũng xử lý các trường hợp tệp là symlink, ngay cả khi symlink trỏ đến một mục không tồn tại.
2. Sử Dụng mkstemp()
:
Giải Pháp: Khi cần tạo tệp tạm thời, sử dụng hàm
mkstemp()
. Hàm này tạo một tệp với một tên ngẫu nhiên, khó đoán, và cũng sử dụng cờO_EXCL
để tránh việc các cuộc tấn công symlink.mkstemp()
cũng đảm bảo rằng tệp được tạo ra một cách an toàn và độc quyền.Tệp được tạo ra bởi
mkstemp()
sẽ được xóa khi các mô tả tệp được đóng.
3. Biện Pháp Cụ Thể Trên Linux:
Bảo Vệ Symlink:
Kích Hoạt: Bạn có thể kích hoạt bảo vệ symlink trên Linux bằng cách gõ lệnh:
Điều này làm cho các tiến trình chỉ có thể theo dõi symlink nếu tiến trình sở hữu symlink hoặc thư mục có cùng chủ sở hữu (thường là root). Điều này làm giảm khả năng kẻ tấn công có thể khai thác symlink trong các thư mục viết được bởi mọi người, như
/tmp
.Bảo Vệ Hardlink:
Tương tự, bạn có thể kích hoạt bảo vệ hardlink:
Điều này yêu cầu người dùng phải có quyền đọc và ghi để tạo hardlink.
Cờ
O_TMPFILE
:Giải Pháp: Sử dụng cờ
O_TMPFILE
với hàmopen()
. Cờ này sẽ tạo một tệp không có liên kết trong hệ thống tệp, nghĩa là nó chỉ cấp phát một inode mà không đặt tên cho nó. Điều này đảm bảo rằng không có khả năng tấn công symlink vì inode không có liên kết và tệp sẽ tự động bị xóa khi tất cả các mô tả tệp mở được đóng.
Last updated