Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
1,36 MB
Nội dung
MỤC LỤC Lời nói đầu Ra mắt năm 1991 đến tảng Linux ưa chuộng nhờ sở hữu bảo mật ổn định cực cao Tuy nhiên, hai chuyên bảo mật đại học Valencia ( Hector Marco & Ismarel Ripoll) phát bug (lỗ hổng) nghiêm trọng vài phân phối Linux Theo đó, cần nhấn phím backspace 28 lần, bypass hệ thống bảo vệ mật trình khởi động máy tính Linux Lỗi đánh mã CVE là: CVE-2015-8370 Cụ thể, lỗ hổng phát Grub2 (Grand Unified Bootloader) - bootloader nạp vào hệ thống Linux máy tính khởi động Sau nhấn 28 lần phím backspace ô Grub username, hệ thống tự khởi động chương trình "Grub rescue shell" - cho phép truy cập không cần ủy quyền vào máy tính Sau đó, kẻ xấu đàng hoàng truy cập toàn liệu, ăn cắp, phá hoại cài đặt mã độc rootkit để kiểm soát thiết bị I, Miêu tả Ngày 10/12/2015 hai chuyên gia bảo mật Cybersercurity Group phát lỗ hổng bảo mật Grub2 Các phiên từ 1.98(12/2009) đến 2.02(12/2015) bị ảnh hưởng Lỗ hổng bị khai thác trường hợp cụ thể cho phép kẻ công có thẻ vượt qua lớp xác thực người dùng ( mật khẩu) từ chiếm quyền điều khiển hệ thống Grub2 nạp khởi động sử dụng hầu hết hệ thống Linux bao gồm số hệ thống nhúng Điều dẫn đến số lượng lớn thiết bị bị ảnh hưởng Grub yêu cầu nhập username ấn phím Backspace 28 lần , xuất rescue shell có nghĩa Grub bạn bị ảnh hưởng II, Mức độ ảnh hưởng Khi kẻ công khai thác thành công lỗ hổng mở Grub rescue shell Grub rescue shell shell mạnh mẽ cho phép: • • • Leo thang đặc quyền: kẻ công vượt qua lớp xác thực người dùng mà không cần password hay username Kẻ công có toàn quyền truy cập vào grub’s console Đánh cắp thông tin: kẻ công tải lên nhân hệ điều hành riêng ( ví dụ từ USB) sau từ môi trường thoải mái chép toàn liễu cài rootkit Từ chối dịch vụ: kẻ công phá hủy liệu grub, hacker ghi đè liệu lên đĩa gây công DoS III, Tìm hiểu lỗ hổng Các lỗi (bug) tìm thấy mã Grub từ phiên 1.98 (12/2009) Lỗ giới thiệu b391bdb2f2c5ccf29da66cecdbfb7566656a704d có ảnh hưởng đến hàm grub_password_get() Lỗi tràn số nguyên tìm thấy hàm grub_username_get() grub_password_get() nằm grub-cỏe/normal/auth.c lib/cryto.c Cả hầm giống ngoại trừ việc hàm grub_username_get() gọi phương thức printf() Đây điểm khai thác lỗi static int grub_username_get (char buf[], unsigned buf_size) { unsigned cur_len = 0; int key; while (1) { key = grub_getkey (); if (key == '\n' || key == '\r') break; if (key == '\e') { cur_len = 0; break; } if (key == '\b') // Does not checks underflows !! { cur_len ; // Integer underflow !! grub_printf ("\b"); continue; } if (!grub_isprint (key)) continue; if (cur_len + < buf_size) { buf[cur_len++] = key; // Off-by-two !! grub_printf ("%c", key); } } grub_memset( buf + cur_len, 0, buf_size - cur_len); // Out of bounds overwrite grub_xputs ("\n"); grub_refresh (); return (key != '\e'); } Nguyên nhân gây lỗi việc giảm giá trị biến cur_len không kiểm soát phạm vi IV, Điểm khai thác Lỗi tràn số nguyên khai thác để gây lỗi nhớ ( Off-by-two Out of bounds overwrite) Các lỗi cũ ghi đè lên byte đệm biến username ( biến cục gọi phương thức đăng nhập hàm grub_auth_check_authentication()), vùng không chứa thông tin xây dựng lên công Out of bounds overwrite lỗi cho phép ghi đè số lên vùng đệm biến username Điều grub_memset() thiết lập để ghi đè số nên byte k sử dụng vùng đệm biên username Để làm điều đó, mã tính toán địa byte không sử dụng byte phải bị xóa trắng đệm Kết tính toán thông qua đối số cho grub_memset (): grub_memset (buf + cur_len, 0, buf_size - cur_len); Lợi dụng lỗi hacker bấm phím Backspace để giảm biến cur_len, tạo giá trị cao Giá trị sử dụng để tính toán địa bắt đầu để xóa: địa đích = buf+cur_len Tại thời điểm này, lỗi tràn thứ hai xảy việc bổ sung có giá trị lớn với sở địa nơi cư trú tên đệm không giữ biến 32-bit Do đó, cần phải quản lý việc giảm tràn thứ hai để tính toán địa đích grub_memset () bắt đầu đặt số cho đệm: cur_len ; // Integer underflow grub_memset (buf + cur_len, 0, buf_size - cur_len); // Integer overflow Ví dụ sau giúp để hiểu làm khai thác Giả sử đệm tên nằm 0x7f674 địa hacker bấm phím backspace lần (sản xuất underflow để 0xFFFFFFFF) memset kết là: grub_memset (0x7f673, 0, 1025); Đối số là: (buf + cur_len) = (0x7f674 + 0xFFFFFFFF) = (0x7f674-1) = 0x7f673, đối số thứ hai: giá trị liên tục sử dụng để ghi đè lên khu vực này, trường hợp 0, số thứ ba số byte để ghi đè lên: (buf_size-cur_len) = (1024 - (- 1)) = 1025 Vì vậy, đệm toàn tên người dùng (1024) cộng với byte đệm thiết lập Do đó, số lần ấn phim Backspace (không giới thiệu tên người dùng), số lượng byte bên tên người dùng set Bây giờ, ghi đè lên số tùy ý byte tên người dùng, cần phải tìm địa nhớ thú vị mà ghi đè lên với số không Một nhìn nhanh vào stack frame cho thấy ghi đè lên địa trở lại grub_memset function () Những hình ảnh sau phác thảo bố trí ngăn xếp nhớ: Như thể hình trên, địa trở lại grub_memset ()là khoảng cách 16-byte từ đệm tên người dùng Nói cách khác, bấm phím Backspace 17 lần, ghi đè lên byte cao địa trở lại Vì vậy, thay gọi lại hàm 0x07eb53e8 chuyển đến 0x00eb53e8 Khi grub_memset () kết thúc, dòng điều khiển chuyển đến địa 0x00eb53e8 gây khởi động lại Điều tương tự xảy bấm Backspace 18, 19 20 lần, trường hợp hệ thống khởi động lại Tại thời điểm này, chuyển hướng luồng điều khiển Có tiến trình sau jumping tới 0x0? Tại địa 0x0 IVT (Interrupt Vector Table) xử lý chứa loạt trỏ hình thức phân khúc: offset Ở giai đoạn đầu tiến trình khởi động, xử lý khuôn khổ thực không đầy đủ chức Tiếp theo khác biệt môi trường thực thi trình thường xuyên với: • • • • • • • Bộ xử lý "chế độ bảo vệ" Grub2 cho phép chế độ đầu Bộ nhớ ảo không kích hoạt Không có bảo vệ nhớ Các nhớ đọc / ghi / thực thi Đó là, không NX / DEP Bộ vi xử lý thực thi tập lệnh 32-bit, chí kiến trúc 64-bit Bộ vi xử lí tự sửa "Nếu ghi ảnh hưởng đến lệnh tìm nạp trước, hàng đợi prefetch không giá trị." Không stack Smashing Protector (SSP) Không Address Space Layout Randomization (ASLR) Do đó, nhảy đến 0x0 không gây bẫy nó, cần phải kiểm soát dòng chảy thực để đạt mục tiêu chức grub_rescue_run () có chứa vòng lặp Rescue Shell grub2 Chúng ta kiểm soát nhảy đến 0x0? Các "trong khi" vòng lặp grub_username_get () kết thúc người dùng chạm [Enter] [Esc] Các register % ebx chứa giá trị phím đánh máy cuối (0xd 0x8, Nhập mã ascii Esc tương ứng) Các register %esi giữ giá trị biến cur_len Các điểm trỏ dẫn đến địa 0x0 Register % esi chứa giá trị -28 (khai thác công trình cách nhấn 28 lần backspace), sau nhấn [Enter] (% ebx == 0xb) Kỹ thuật đảo ngược IVT Nếu trạng thái xử lý tóm tắt bảng trước đó, mã IVT thực giống memcpy (), mà từ địa trỏ bởi% esi để 0x0 (chính nó) Do đó, IVT mã tự sửa chữa, chọn khối mã mà muốn chép từ Trình tự sau cho thấy trình tự mã thực thực register %esi có giá trị -28 (0xffffffe4) Trong lần lặp thứ ba, mã kết chứa lệnh retw 0x0007 Các trỏ có giá trị bằng% esp 0xe00c Và vậy, hướng dẫn retw thực thi, lưu lượng thực thi nhảy vào 0xe00c Địa thuộc chức grub_rescue_run (): : 0xdfef: push %ebp 0xdff0: mov %esp,%ebp 0xdff2: sub $0x24,%esp 0xdff5: push $0xe90a 0xdffa: call 0xd53b # 0xdfff: add $0x10,%esp 0xe002: call 0xbfd2 # 0xe007: xor %edx,%edx 0xe009: lea -0xc(%ebp),%eax ->0xe00c: movl $0x0,0x16ce0 > 0xe016: call 0xdf28 void attribute grub_rescue_run (void){ ((noreturn)) while (1) { char *line; /* Print an error, if any */ grub_print_error (); ->grub_errno = GRUB_ERR_NONE; grub_rescue_read_line (&line, 0, NULL); if (! line || line[0] == '\0') continue; 10 grub_rescue_parse_line (line, grub_rescue_read_line, NULL); grub_free (line); } } 11 May mắn thay, nội dung nhớ bị thay đổi nhỏ, sử dụng tất chức GRUB Chỉ vector ngắt IVT sửa đổi, kể từ vi xử lý chế độ bảo vệ, IVT không sử dụng Mặc dù nghiên cứu hàm GRUB2 rescure , không thực chứng thực Nếu trở lại với chế độ "bình thường", menu grub với khả chỉnh sửa đầy đủ, GRUB yêu cầu người dùng mật hợp lệ Vì vậy, trực tiếp bắt đầu gõ lệnh GRUB2, chí bao gồm module để thêm chức GRUB mới, để triển khai phần mềm độc hại vào hệ thống khởi động môi trường thoải mái nhiều cách chạy shell bash hoàn chỉnh từ Linux Để chạy bash Linux, sử dụng lệnh GRUB2 linux, initrd insmod 12 Mặc dù sử dụng GRUB2 lệnh để chạy hạt nhân Linux để triển khai phần mềm độc hại hoàn toàn có thể, thấy rằng, giải pháp đơn giản để vá mã GRUB2 RAM để xác thực sau trở chế độ "bình thường" Ý tưởng để làm điều đó, để sửa đổi điều kiện mà checkes cho dù người sử dụng chứng thực hay không Hàm is_authenticated () file grub-core / normal / auth.c Sửa đổi thực cách sử dụng write_word GRUB2 rescure Và sau đó, thứ sẵn sàng để quay trở lại chế độ GRUB2 bình thường Nói cách khác, nhập vào "chế độ chỉnh sửa" GRUB2 không yêu cầu người dùng mật 13 grub rescue> write_word 0x7eb514e 0x90909090 grub rescue> normal 14 V, Một công ATP sửa dụng lỗi 0-day Truy cập vật lý "cao cấp" tính APTs (hoặc nội bộ) Một mục tiêu APT ăn cắp thông tin nhạy cảm Cyberspying Sau ví dụ đơn giản cách APT lây nhiễm sang hệ thống có kiên trì để phía sau ăn cắp liệu người dùng Sau tóm tắt cấu hình hệ thống: • • • • BIOS / UEFI bảo vệ mật chế độ chỉnh sửa GRUB2 bảo vệ mật khởi động bên bị vô hiệu hóa: CD-ROM, DVD, USB, Netboot, PXE Các liệu người dùng (HOME) mã hoá 15 Như trước, mục tiêu để ăn cắp liệu người dùng Kể từ liệu mã hoá, chiến lược, sử dụng để lây nhiễm hệ thống chờ người dùng giải mã liệu (bằng cách đăng nhập vào hệ thống) sau truy cập vào thông tin plain Chuẩn bị môi trường để triển khai malware Bằng cách vá GRUB2 trước đây, dễ dàng chỉnh sửa mục nhập linux để tải hạt nhân Linux có root shell Đây thủ thuật cũ sử dụng, cách thêm init = / bin / bash để mục linux, có root Linux shell, môi trường thoải mái nhiều cho việc triển khai phần mềm độc hại 16 Lưu ý kể / bin / bash trình chạy, syslog daemon không chạy, đó, ghi không ghi lại Đó là, truy cập phát cách sử dụng bình thường theo dõi Linux Triển khai malware cài cắm lâu dài Để khai thác 0-Day grub2 lỗ hổng này, sử dụng PoC đơn giản PoC Đây thư viện Firefox sửa đổi mà tạo trình chạy trình bao ngược đến máy chủ kiểm soát cổng 53 Rõ ràng, ví dụ đơn giản, phần mềm độc hại thực tế exfiltrate thông tin nhiều lút 17 Các thư viện sửa đổi tải lên VirusTotal báo cáo nhiễm / virus số 55 công cụ Firefox trình duyệt web có sử dụng Internet, gửi yêu cầu tới HTTP cổng DNS, đó, không xuất để nghi ngờ chuyện phần mềm độc hại với cổng Để lây nhiễm hệ thống đơn giản đặt thư viện sửa đổi libplc4.so vào USB sau thay gốc Chúng ta phải gắn với quyền ghi hệ thống gắn USB thể hình ảnh sau đây: Khi người sử dụng thực trình duyệt Firefox, shell gọi Tại thời điểm tất liệu người dùng giải mã, cho phép để ăn cắp loại thông tin người sử dụng Để kết thúc phần trì, có giá trị đề cập đến sửa đổi hạt nhân đơn giản mà nằm phân vùng / boot, mà theo mặc định không mã hoá, nâng cao đặc quyền để triển khai phần mềm độc hại dai dẳng 18 VI, Vá lỗi Chúng ta cập nhật vá lỗi sau $ git clone git://git.savannah.gnu.org/grub.git grub.git $ cd grub.git $ wget http://hmarco.org/bugs/patches/0001-Fix-CVE-2015-8370-Grub2-userpass-vulnerability.patch $ git apply 0001-Fix-CVE-2015-8370-Grub2-user-pass-vulnerability.patch Tài liệu tham khảo: http://hmarco.org/bugs/CVE-2015-8370-Grub2-authentication-bypass.html https://www.youtube.com/watch?v=cr464P8Yv8Q 19