Vượt qua BitLocker bằng memory dump trên Windows 11
(noinitrd.github.io)- Trình diễn cách dump RAM trong môi trường Windows 11 24H2 bằng Memory-Dump-UEFI để tìm FVEK, khóa mã hóa toàn bộ volume, và truy cập volume được BitLocker bảo vệ
- Nếu kẻ tấn công có thể tiếp cận vật lý thiết bị, họ có thể nhắm vào khóa còn sót lại trong RAM ngay sau khi khởi động lại, nhưng thời gian mất điện càng lâu thì nguy cơ hỏng nội dung RAM càng cao
- Bản trình diễn sử dụng cách chập reset pins trên bo mạch chủ để khởi động lại mà không làm mất nguồn, và không đi sâu vào các trường hợp vượt qua Secure Boot
- Trong dump của Windows 11, FVEK được tìm thấy dưới thẻ
dFVEvàNonethay vìFVEccủa Windows 7 hayCngbcủa Windows 8.1/10 - Dù Microsoft cố hủy khóa bằng các hàm như
SymCryptSessionDestroy, khóa vẫn có thể còn lại trên heap, nên cách tiếp cận trực diện nhất để phân tích cách triển khai BitLocker là debug ở mức kernel
Phạm vi trình diễn vượt qua BitLocker trên Windows 11
- Mục tiêu là Windows 11 version 24H2, với phương pháp trích xuất FVEK, khóa mã hóa toàn bộ volume của BitLocker, từ bộ nhớ
- Sử dụng ứng dụng UEFI Memory-Dump-UEFI để dump nội dung RAM
- Giả định cốt lõi là kẻ tấn công có quyền tiếp cận vật lý với thiết bị
Điều kiện để dump RAM khả thi
- RAM của phiên Windows vừa chạy gần đây có thể vẫn còn chứa thông tin nhạy cảm như FVEK
- Khi mất điện, nội dung RAM sẽ hỏng đi rất nhanh, nên cần giảm tối đa khoảng thời gian máy tính tắt hẳn trong quá trình khởi động lại
- Các cách giảm hỏng RAM gồm làm lạnh vật lý hoặc duy trì cấp nguồn ngoài; trong bản trình diễn này, tác giả chập reset pins trên bo mạch chủ để khởi động lại mà không mất nguồn
- Secure Boot là tiêu chuẩn bảo mật giới hạn những gì được phép chạy khi thiết bị khởi động, nhưng đã có các trường hợp vượt qua bằng shim; phần này không được bàn chi tiết trong bản demo
Chuẩn bị USB boot và tạo dump
- USB boot cần có thiết bị lưu trữ lớn hơn dung lượng RAM của hệ thống mục tiêu
- Script
flashimage.shgiúp đơn giản hóa việc chuẩn bị ứng dụng có thể khởi động - Quy trình tạo và sử dụng ứng dụng boot được tổng hợp tại MemoryDumpUEFI
- Khả năng tìm thấy FVEK cao nhất khi khởi động lại lúc Windows đang trong quá trình tải nhưng trước khi màn hình đăng nhập xuất hiện
- Sau đó boot ngay từ thiết bị USB vào Memory-Dump-UEFI rồi chạy
app.efitrong UEFI shell- Cách chạy có thêm các bước trong README của ứng dụng
- Thời gian dump phụ thuộc vào dung lượng RAM và tốc độ của thiết bị USB
- Để tránh ghi nhầm sang ổ khác, nên tháo các thiết bị lưu trữ USB khác
Xử lý file dump và công cụ tìm kiếm
- Memory-Dump-UEFI có thể tạo ra nhiều file dump
- Để phù hợp với đặc tả UEFI, cần dùng hệ thống file FAT32, nhưng FAT32 có giới hạn kích thước file 4GB
concatDumpstrong thư mụctoolsghép nhiều dump thành một file duy nhất theo thứ tự thời gian- Dump là dữ liệu thô đang có trong bộ nhớ tại thời điểm đó, nên có thể xem dễ hơn bằng công cụ như
xxd searchMemcho phép tìm mẫu hex trong dump và di chuyển đến offset nơi mẫu được phát hiện
Pool tag và vị trí FVEK
- Pool tag là định danh 4 ký tự cho biết vùng memory pool nào của kernel Windows đang được sử dụng
- Memory pool do kernel Windows cấp phát có thể là vị trí tốt để tìm thông tin nhạy cảm
pooltag.txtchứa danh sách các pool tag và thông tin về mục đích của chúng- Ở các phiên bản Windows trước, vị trí khóa BitLocker khác nhau
- Trên Windows 7, có thể khôi phục khóa từ pool tag
FVEc, tương ứng với vùng cấp phát mã hóa củafvevol.sys - Trên Windows 8.1 và Windows 10, có thể tìm khóa trong memory pool mang thẻ
Cngb, tương ứng với moduleksecdd.sys
- Trên Windows 7, có thể khôi phục khóa từ pool tag
- Trong dump của Windows 11, không tìm thấy khóa ở
FVEchayCngb; thay vào đó FVEK xuất hiện ở hai vị trí- Vị trí thứ nhất là dưới pool tag
dFVE, biểu thị vùng nhớ dodumpfve.syscấp phát dumpfve.sysliên quan đến full volume encryption crash dump filter của BitLocker drive encryption- Vị trí
dFVElà nơi khóa được tìm thấy dễ nhất và ổn định nhất - Trước khóa ở vị trí này có giá trị
0x0480biểu thị kiểu mã hóa; trong môi trường trình diễn, nó có nghĩa là XTS-AES-128 - Vị trí thứ hai là dưới thẻ
None, liên quan đến lời gọiExAllocatePool - Ở vị trí này, nửa đầu của khóa xuất hiện hai lần, còn nửa sau xuất hiện một lần
- Vị trí thứ nhất là dưới pool tag
Truy cập volume BitLocker bằng FVEK
- Khóa thu được cần được thêm giá trị thuật toán mã hóa đang dùng ở phía trước
- Trong ví dụ, giá trị thuật toán
0x8004được thêm vào trước khóa dưới dạng little endian là0480 - Giá trị tạo ra theo cách này có thể được lưu thành file để dùng dưới dạng
output.fvek - Bộ công cụ dislocker được khuyến nghị để xác định thuật toán và giá trị cần thiết, cũng như mở khóa phân vùng được BitLocker bảo vệ
- Nếu làm đúng quy trình, có thể dùng
output.fvekđể truy cập dữ liệu trên volume được BitLocker bảo vệ
Phân tích triển khai BitLocker và khóa còn lại trên heap
- Cách trực diện nhất để hiểu cách triển khai BitLocker là debug ở mức kernel bằng
windbg - Kernel debugging có thể thực hiện tương đối dễ bằng máy ảo hoặc cáp crossed over USB 3.0 A/A
- Việc theo dõi từng bước quá trình boot của Windows và quan sát hoạt động BitLocker đã giúp xác định vị trí khóa
- Microsoft cố hủy khóa bằng các hàm như
SymCryptSessionDestroy, nhưng khóa vẫn có thể còn lại trên heap nên không thể loại bỏ hoàn toàn mọi khóa
Liên kết tham khảo
- recovering-bitlocker-keys-on-windows-8-1-and-10: Tài liệu về khôi phục khóa BitLocker trên Windows 8.1 và Windows 10
- dislocker: Bộ công cụ được dùng để truy cập volume BitLocker
- SymCrypt: Thư viện mã hóa của Microsoft
- libbde: Thư viện liên quan đến BitLocker Drive Encryption
- pooltag.txt: Danh sách pool tag của Windows
- An Introduction to Pool Tags: Tài liệu giới thiệu pool tag của Microsoft
1 bình luận
Các ý kiến trên Hacker News
Tôi cho rằng BitLocker phát huy lợi ích lớn nhất khi dùng TPM (PCR 7+11)+PIN
Nếu không có PIN thì không thể đọc được FVEK, nên có thể giảm nhẹ cuộc tấn công này; và nếu BitLocker được triển khai đúng, khi nhập sai PIN quá nhiều lần thì TPM sẽ chuyển sang chế độ khóa chống tấn công từ điển
Tôi đã cố thử cấu hình tương tự trên Linux suốt mấy tháng, nhưng systemd-cryptsetup/cryptenroll là dành cho LUKS, còn trường hợp của tôi là muốn dùng fscrypt để mã hóa vài thư mục nhạy cảm (khóa secure boot và /home) trên eMMC tích hợp chậm
Khi vượt quá mức cơ bản, tôi thấy lập trình TPM cực kỳ khó: phải ràng buộc với PCR 7, ràng buộc với PCR 11 vốn thay đổi mỗi khi cập nhật kernel/init/cmdline, dùng PIN chứ không phải AuthValue, dùng cùng chính sách ủy quyền để đặt lại bộ đếm khóa DA khi đăng nhập, đồng thời vẫn có mật khẩu dài/AuthValue cho việc đặt lại thủ công, rồi còn phải khớp cả chữ ký PCR 11 và khóa công khai do systemd-stub cung cấp
Ngoài các hướng dẫn TPM cơ bản thì gần như không có tài liệu, nên nếu có chuyên gia nào thì tôi rất muốn được giúp đỡ. Đây là dự án cá nhân, nhưng nếu một ngày nào đó hoàn thành, tôi định sẽ viết lại thành bài
Cách đó đáng cân nhắc như một cơ chế khôi phục
Một trong những lý do ít người mày mò TPM mã nguồn mở như thú vui là vì có nhiều lựa chọn thay thế giải quyết nhu cầu tương tự dễ hơn nhiều
Nếu muốn gắn khóa mã hóa quan trọng với phần cứng thì mua Yubikey là được; nếu mật khẩu mã hóa ổ đĩa laptop quá phiền, có thể dùng chế độ chờ khi đóng nắp thay vì tắt máy hoàn toàn
Nếu mật khẩu đăng nhập bất tiện thì có đầu đọc vân tay hoặc Yubikey hỗ trợ sinh trắc học; còn nếu cần khởi động không mật khẩu như kiosk không người trực hay phòng máy tính trường học, thì cứ đặt máy trong hộp kim loại chắc chắn rồi xích vào tường
Nếu máy chủ trung tâm dữ liệu cần khởi động không người trực, hãy chuyển nó vào trung tâm dữ liệu có an ninh vật lý đáng tin cậy; nếu vẫn lo, dùng Dropbear hoặc Tang để máy chỉ khởi động khi ở đúng mạng
Nếu bạn đang nghịch TPM cho homelab như một thú vui, tốt nhất nên tự kiểm tra xem làm việc với TPM có thật sự vui không, và rất có thể bạn sẽ nhận ra là không
Nếu không thì chẳng lẽ mỗi lần giải mã một block đĩa lại phải nhập PIN? Ảnh hưởng hiệu năng khi gọi TPM cho từng thao tác đĩa cũng rất lớn
Cuộc tấn công này đọc khóa từ RAM, nên tôi không hiểu TPM PIN giảm nhẹ rủi ro bằng cách nào
Nếu trước khi boot phải nhập mật khẩu, và mật khẩu đó phải kết hợp với khóa TPM mới mở được ổ đĩa, thì điều đó sẽ hữu ích trong tình huống về sau khóa TPM bị phát hiện
Tuy vậy, khó chắc được biện pháp nào sẽ giúp được bao nhiêu trước cuộc tấn công này. Để OS duy trì quyền đọc/ghi ổ đĩa, nó phải giữ khóa ở đâu đó, nên nếu chỉ thay đổi nơi tìm khóa thì trong hầu hết kịch bản vẫn có thể khôi phục dữ liệu RAM kiểu này
Tôi nhớ các thiết bị Apple không để khóa rời khỏi vùng bảo mật (enclave), nên có lẽ không dễ bị kiểu tấn công này. TPM 3.0 có vẻ cần tiến gần hơn nhiều theo hướng đó
Trên ThinkPad có thể dùng vân tay thay cho mật khẩu bật nguồn, và cấu hình này khiến thiết bị gần như vô dụng với kẻ trộm, nên tôi thích nó hơn BitLocker PIN
Tất nhiên mật khẩu bật nguồn và xác thực vân tay cũng chỉ mạnh ngang TPM, nhưng BitLocker TPM+PIN cũng vậy chẳng phải sao
Việc sau các phần mềm mã hóa mã nguồn mở thành công lại chuyển sang TPM khiến tôi thấy kỳ lạ. Trông như kiểu “đã có kho lưu trữ siêu an toàn do các tập đoàn lớn cung cấp, nên đừng lo lắng hay đặt câu hỏi”
Tôi nghi rằng chắc chắn có một cửa hậu cho phép cơ quan tình báo tải xuống mọi PIN và mật khẩu rồi truy cập dữ liệu
Về cơ bản tôi không hiểu rõ mô hình bảo mật của BitLocker
Trong hầu hết các bản cài đặt, có vẻ như chỉ cần nhấn nút nguồn là máy sẽ khởi động vào Windows
Vậy nếu ai đó đánh cắp một thiết bị có ổ cứng đã mã hóa, họ chỉ cần bật máy lên là được sao? Chắc chắn không phải vậy, nhưng đồng thời tôi cũng không biết cách ngăn cuộc tấn công cụ thể này
Có lẽ phải giả định rằng lưu lượng bus SPI được mã hóa nên không thể dump khóa theo cách này, nhưng dù sao thì có vẻ máy vẫn khá dễ dàng nhả khóa ra
LUKS ít nhất còn có prompt nhập mật khẩu để mở khóa ổ đĩa
Lạ là Microsoft không dùng mã hóa tham số TPM, nên cứ mỗi 1–2 năm lại có nhà nghiên cứu bảo mật chế tạo một thiết bị sniff TPM để trình diễn
LUKS cũng tùy cấu hình. Linux cũng có thể được cấu hình theo cách giống Windows ở đây, và máy chủ an ninh video gia đình của tôi cũng cần khởi động lại âm thầm nên tôi đã thiết lập như vậy. Tôi biết nó dễ bị tấn công warm/cold boot và bề mặt tấn công phần mềm, nhưng nếu ai đó chỉ tháo ổ đĩa đi thì vẫn an toàn
Windows cũng có thể được cấu hình để yêu cầu mật khẩu hoặc dùng khóa TPM được niêm phong bằng xác thực PIN
Bỏ qua vấn đề mã hóa tham số và sniff bus, BitLocker dịch chuyển ranh giới từ “bất kỳ ai cũng có thể đọc ổ đĩa” sang “phải thực hiện tấn công cấp nền tảng để lấy nội dung bộ nhớ, hoặc hack các dịch vụ chạy ở màn hình đăng nhập”
Nó chặn rất tốt các tình huống kiểu đánh cắp dữ liệu tài chính từ ổ cứng được tái sử dụng tùy tiện, nên thực tế đây là một cải thiện bảo mật khá tốt
Cần có cách vượt qua như lỗ hổng thực thi mã từ xa hoặc khởi động bằng bootloader Windows cũ có lỗ hổng. Vì ổ đĩa đang bị khóa nên không dùng được kiểu vượt qua phổ biến “đổi bàn phím phần mềm thành cmd.exe”
Không có BitLocker thì có thể cắm ổ Windows vào PC khác và xem mọi tệp. Có BitLocker thì phải vật lộn với phần mềm Microsoft dễ tổn thương, lỗ hổng, bộ nhớ bị dump và những thứ tương tự, mà cũng không phải lúc nào cũng thành công
Nếu thiết lập BitLocker ở chế độ TPM+PIN thì vì không có mật khẩu để mở TPM, ngay cả việc đó cũng không làm được. Cũng có thể để BitLocker ở chế độ chỉ dùng mật khẩu, nhưng như vậy dễ bị brute force hơn nhiều
LUKS cũng tương tự; hiện nay hầu hết các bản phân phối Linux đều hỗ trợ TPM và TPM+PIN
Nếu cố khởi động lại vào safe mode, hoặc khởi động lại sang OS khác, tiện ích cập nhật firmware, v.v. thì sẽ phải nhập khóa khôi phục BitLocker
Tôi không rõ việc “hack” cảm biến vân tay hoặc webcam nhận diện khuôn mặt hoạt động nội bộ như thế nào
Cần giả định rằng TPM không có lỗ hổng trích xuất khóa
Điểm mấu chốt là khi máy đang tắt nguồn
Với mã hóa ổ đĩa đa dụng, TPM quá chậm để giải mã dữ liệu khối lượng lớn thực sự, nên cuối cùng OS vẫn có khóa có thể bị trích xuất
Trên bản Pro, cũng có thể dùng Group Policy để yêu cầu bước tương tác khi khởi động. Nó hoạt động ngay cả khi không có TPM; trong trường hợp này, mỗi lần khởi động sẽ hỏi mật khẩu
Việc này có thể bị chặn hoàn toàn bằng https://trustedcomputinggroup.org/resource/pc-client-work-gr...
Nếu được bật, trong trường hợp OS không tắt bình thường nên không có cơ hội xóa khóa mã hóa, firmware sẽ dừng lại trước lần khởi động tiếp theo và xóa RAM
Tôi tò mò không biết Windows không dùng tính năng này, hay hệ thống được thử nghiệm không triển khai nó
Tài liệu nói rằng “BitLocker sử dụng TCG Reset Attack Mitigation, còn gọi là bit MOR (Memory Overwrite Request), trước khi trích xuất khóa vào bộ nhớ”
Tuy nhiên tôi hoàn toàn không tin hầu hết các triển khai nền tảng. Tôi chưa từng thấy nền tảng UEFI nào, dưới bất kỳ hình thức nào, triển khai gần đúng nghĩa
Sẽ thú vị nếu biết nhà nghiên cứu này đã dùng nền tảng nào, và nền tảng đó có tuyên bố hỗ trợ bit MOR hay không
Chỉ cần xem Team Tweezers đã tấn công Wii đời đầu như thế nào là đủ
Biện pháp giảm thiểu thực sự là tính năng mã hóa bộ nhớ của CPU hiện đại. Vì nó nằm bên trong die nên nhíp không chạm tới được; chỉ cần xóa khóa là mất ngay lập tức, và ngay cả khi sống sót qua chu kỳ nguồn thì cũng rất khó can thiệp
Lý tưởng nhất là khóa chỉ nên nằm trong bộ nhớ đệm SRAM của CPU và tuyệt đối không bao giờ đi ra ngoài die CPU
Tôi là người viết bài. Nếu có câu hỏi, có thể nhắn cho tôi qua tài khoản này
Công việc này thực sự rất thú vị và cảm ơn mọi người đã quan tâm nhiều
Bài trình bày 38C3 liên quan đến việc vượt qua BitLocker trên Windows 11: https://media.ccc.de/v/38c3-windows-bitlocker-screwed-withou...
Khá nhiều người đã biết rằng BitLocker chỉ bảo vệ đúng nghĩa khi máy tính đã tắt, và ngay cả vậy cũng chỉ khi BitLocker được cấu hình để yêu cầu mật khẩu khởi động
[0] https://en.wikipedia.org/wiki/BitLocker#TPM_alone_is_not_eno...
Windows có tùy chọn mã hóa bộ nhớ được đề xuất cùng với nén bộ nhớ
Cả Intel lẫn AMD đều đang đưa tính năng này vào CPU
Tuy nhiên, mục tiêu có vẻ không phải là laptop mà là các máy chủ chạy nhiều máy ảo
Sẽ không có gì đáng ngạc nhiên nếu chẳng bao lâu nữa các “máy ảo” được mã hóa được dùng làm phương tiện lưu trữ những giá trị bí mật như vậy. Điều cần thiết là hỗ trợ phần cứng trở nên phổ biến rộng rãi trên các nền tảng tiêu dùng
Tuy nhiên, các cuộc tấn công kênh kề CPU trước đây đã cho thấy bộ nhớ được mã hóa cũng có thể bị tấn công (https://www.usenix.org/conference/usenixsecurity21/presentat...). Chúng nhắm vào cache khi CPU giải mã bộ nhớ để hoạt động bình thường
Việc này sẽ giúp vô hiệu hóa dump bộ nhớ, nhưng RAM được mã hóa sẽ không chấm dứt được việc dump khóa từ bộ nhớ. Đặc biệt là trước những kẻ tấn công kiên nhẫn hoặc có kỹ năng cao
https://techcommunity.microsoft.com/blog/windowsosplatform/m...
Nén bộ nhớ đã có từ lâu, ít nhất là từ Windows 10 RTM. Tất cả các hệ điều hành lớn đều đã triển khai tính năng này, nhưng nó không liên quan đến bảo mật
Bài liên quan: Vượt qua BitLocker trên laptop Lenovo bằng bộ phân tích logic giá rẻ
https://news.ycombinator.com/item?id=37249623
Với các cuộc tấn công dựa vào việc đọc dump bộ nhớ của máy mục tiêu, tôi tự hỏi nếu có quyền truy cập vật lý thì một thiết bị interposer sao chép hoặc sửa đổi dữ liệu đi vào và đi ra khỏi RAM sẽ thực tế đến mức nào
Tôi nghĩ đến một thiết bị như “Action Replay” cho Gameboy ngày xưa, vốn cho phép gian lận bằng cách sửa đổi bộ nhớ được nạp hoặc thực thi từ băng game vào hệ thống. Cắm băng game vào Action Replay, rồi cắm Action Replay vào Gameboy
Liệu có thể làm điều tương tự giữa RAM và bo mạch chủ không? Kiểu như cắm RAM vào thiết bị, cắm thiết bị đó vào bo mạch chủ, rồi quan sát các thao tác đọc/ghi bộ nhớ để chụp trạng thái bộ nhớ tại một thời điểm tùy ý
Như vậy có thể tránh được sự phiền phức của việc phải tắt nguồn thủ công và hy vọng dữ liệu cần thiết vẫn còn đó
Tôi không phải kỹ sư điện nên đây có thể là một đề xuất hoàn toàn bất khả thi. Ràng buộc về không gian vật lý và băng thông chắc chắn có vẻ lớn, nhưng liệu có khả thi không?
Khó kỳ vọng sẽ có một giải pháp thương mại sẵn có
Ít người biết rằng các CPU Intel/AMD ra mắt trong vài năm gần đây hỗ trợ mã hóa toàn bộ bộ nhớ trong suốt
Nội dung RAM được mã hóa bằng một khóa ngẫu nhiên được lưu trong bộ điều khiển bộ nhớ của CPU và được tạo khi reset
Thường thì BIOS tắt tính năng này, vì nó gây một chút suy giảm hiệu năng bộ nhớ (0,1%~1%)
Nhưng nó có thể chặn hoàn toàn cuộc tấn công này