1 điểm bởi GN⁺ 2023-08-25 | 1 bình luận | Chia sẻ qua WhatsApp
  • Nếu BitLocker không mật khẩu phụ thuộc vào TPM rời (discrete TPM), có thể bắt khóa dạng bản rõ trên bus SPI vào lúc VMK được truyền từ TPM sang CPU trong quá trình khởi động
  • Thử nghiệm trên Lenovo L13 được thực hiện bằng DSLogic Plus dưới 100 USD, nhưng giới hạn lấy mẫu khiến việc đọc ổn định bus SPI 33MHz gặp nhiều khó khăn
  • Dữ liệu bắt được cần được phân tích theo thứ tự SPI → TIS → TPM 2.0, và khóa 32 byte bắt đầu bằng 5761 được tìm thấy trong bộ đệm phản hồi TPM2_Unseal
  • Với khóa đã trích xuất, có thể dùng dislocker-fuse để mount phân vùng BitLocker, rồi thay sethc.exe bằng cmd.exe để lấy shell SYSTEM bằng cách nhấn Shift 5 lần
  • Chỉ dùng TPM rời không đủ để bảo vệ hiệu quả; biện pháp phòng thủ thực tế là dùng fTPM hoặc thiết lập PIN/cụm mật khẩu cho BitLocker

Điểm yếu của BitLocker không mật khẩu và TPM rời

  • Phân vùng BitLocker được mã hóa bằng FVEK (Full Volume Encryption Key)
  • FVEK lại được mã hóa bằng VMK (Volume Master Key) và được lưu trên đĩa cùng với dữ liệu đã mã hóa
    • Nhờ cấu trúc này, có thể xoay vòng khóa mà không cần mã hóa lại toàn bộ ổ đĩa
  • VMK được lưu trong TPM
    • Vì vậy ổ đĩa chỉ có thể được giải mã khi khởi động trên đúng máy tính đó
    • Active Directory có cơ chế khôi phục
  • Điểm yếu xuất hiện đúng lúc CPU yêu cầu TPM gửi VMK để giải mã ổ đĩa
    • VMK đi qua bus SPI giữa TPM và CPU dưới dạng bản rõ
    • Nếu bắt được giá trị này thì có thể dùng để giải mã ổ BitLocker

Thiết bị dùng để bắt giao tiếp TPM

  • Thiết bị thử nghiệm là máy phân tích logic DSLogic Plus
    • Năm 2021 đã mua với giá dưới 100 USD, gồm cả thuế và phí vận chuyển
  • Để thu tín hiệu ổn định, tần số lấy mẫu cần khoảng gấp 3~4 lần tần số bus
    • Bus SPI mục tiêu là 33MHz nên cần lấy mẫu tối thiểu 100MHz
    • Thông số DSLogic Plus ghi tối đa 400MHz với 16 kênh, nhưng điều kiện sử dụng thực tế có nhiều giới hạn
  • DSLogic Plus có các giới hạn khá rõ tùy cách bắt và số kênh
    • Số kênh bắt đồng thời càng nhiều thì tần số lấy mẫu càng giảm
    • Chế độ stream có thể bắt lượng dữ liệu lớn trong khoảng 1 phút, nhưng bị giới hạn ở 100MHz với 3 kênh
    • Chế độ buffer có thể lấy mẫu 400MHz nhưng chỉ chạy được vài mili giây nên không thực tế cho tác vụ này
  • Lựa chọn chuyên nghiệp hơn là Saleae đắt hơn khoảng 10 lần; các thiết bị khác có thể xem trong danh sách phần cứng được sigrok hỗ trợ

Kết nối vào bo mạch và thời điểm bắt

  • SPI là bus dùng chung, nên không cần nối trực tiếp vào các chân TPM rất nhỏ
    • Nếu có linh kiện lớn hơn cùng nối vào bus SPI đó thì có thể móc vào phía đó
    • Trong thử nghiệm, một SPI flash gần đó đã được xác định và dùng để nối
    • Linh kiện có ký hiệu nên dễ tra datasheet để xác nhận công dụng
  • Với DSLogic, do tần số lấy mẫu bị giảm nên chỉ bắt 3 đường SPI
    • Các đường quan trọng là CLK, MOSI và MISO
  • Ngưỡng điện áp nên đặt ở khoảng một nửa điện áp tín hiệu
    • Điện áp tín hiệu đo được là 3.3V, và ngưỡng phù hợp là khoảng 1.6V
  • VMK cần tìm được sử dụng ở giai đoạn muộn của POST
    • Trên Lenovo L13, thời điểm đó là ngay sau màn hình splash, khoảng giây thứ 14 trong tổng thời gian khởi động khoảng 25 giây
    • Trước đó cũng có hoạt động SPI, nhưng chủ yếu là đọc và xác minh giai đoạn khởi động đầu, không phải giao tiếp TPM
    • Có thể bắt đầu capture ngay sau lúc bật máy, hoặc để giảm dữ liệu không cần thiết thì bắt đầu sau khoảng 7 giây

Phân tích SPI, TIS và TPM 2.0

  • Tín hiệu bắt được cần được phân tích theo ba lớp: SPI, TIS, TPM 2.0
  • SPI là giao thức đơn giản nên có thể giải mã bằng máy phân tích logic thông thường
    • Khi xung clock chuyển từ 0 lên 1, trạng thái của đường dữ liệu tại thời điểm đó chính là giá trị bit
    • Trong ví dụ, MOSI bằng 0 suốt 8 xung nên được diễn giải là 0x00, còn MISO chỉ bật bit đầu tiên nên là 0x80
  • Phần khó nhất là TIS (TPM Interface Specification)
    • Không tìm được decoder hoạt động đúng nên phải xử lý thủ công
    • libsigrok decoders không giải thích chính xác dữ liệu, nhưng vẫn hữu ích để xác định vùng xấp xỉ nơi diễn ra trao đổi TPM
    • Nguyên nhân thất bại có thể là do capture không có Chip Select, clock không chính xác, thiếu một số byte, hoặc lý do khác
  • Các yêu cầu từ master sang slave có mẫu lặp lại
    • Slave gửi 80 để báo đã sẵn sàng
    • Master gửi header D4 00 24 cùng các byte TPM
    • Slave xác nhận đã đọc bằng 01 FF
  • Các phản hồi từ slave sang master phụ thuộc vào việc thiết lập và đọc thanh ghi
    • Frame ví dụ là kết quả đọc 1 byte từ địa chỉ D4 00 24
    • Slave bắt đầu transaction bằng 80, rồi sau đó xuất hiện giá trị cần quan tâm là 0x80

Tìm khóa trong phản hồi TPM2_Unseal

  • Lệnh TPM dùng để yêu cầu trả về khóa là TPM2_Unseal
  • Việc tách transaction TPM được thực hiện bằng cách tập trung vào phản hồi trên đường MISO hơn là frame yêu cầu
    • Trong dữ liệu SPI thô, lọc theo mask 80 00 00 00 01 .. và chỉ giữ byte wildcard cuối cùng
    • Điểm bắt đầu transaction TPM được nhận diện bằng header 80 01 hoặc 80 02
    • Phản hồi chứa khóa là phản hồi xác thực dài hơn và bắt đầu bằng 80 02
  • Giữa lệnh Unseal và phản hồi có độ trễ khoảng 10ms
    • Header 80 02 biểu thị password session, khác với header 80 01 bản rõ mà đa số yêu cầu sử dụng
    • Có vẻ độ trễ phát sinh do xử lý xác thực của yêu cầu và HMAC của phản hồi
  • Lệnh và phản hồi TPM được thu bằng cách ghép lại từng byte một
    • Công cụ dùng để giải mã là tpmstream-web
    • Khóa trong bộ đệm phản hồi bắt đầu bằng 5761 và có độ dài 32 byte

Mount ổ đĩa và cài cửa hậu

  • Sau khi lưu khóa trích xuất được vào file, truyền file đó cho dislocker-fuse để mount phân vùng BitLocker
  • Lệnh ví dụ tạo file khóa, gắn /dev/sdd3 vào ./mnt/, rồi mount lại dislocker-file vào ./mnt2/
  • Cửa hậu đơn giản nhất là ghi đè chương trình sticky keys của Windows bằng cmd.exe
    • Sao chép Windows/System32/cmd.exe thành Windows/System32/sethc.exe
    • Lắp lại ổ đĩa vào laptop, khởi động, rồi nhấn phím Shift 5 lần để lấy shell SYSTEM

Giới hạn thiết bị và biện pháp phòng thủ

  • Khó có thể khuyến nghị DSLogic cho công việc này
    • Nhiều lần capture thất bại và phải bỏ đi
    • Việc lấy mẫu ở mức gấp 3 lần tốc độ bus chỉ vừa đủ để có clock tương đối ổn định, và vẫn bị mất một số byte
  • Vì giới hạn thiết bị, đã tốn rất nhiều thời gian để hiểu sâu giao thức và phân tích capture thủ công
    • Nếu là trường hợp công ty mua thiết bị, tốt hơn nên chọn máy phân tích logic chuyên dụng
  • Việc dùng TPM rời, trái với kỳ vọng, không làm tăng bảo mật hệ thống mà còn có thể tạo ra ảo giác an toàn
  • Có hai biện pháp phòng thủ
    • Dùng fTPM
    • Nếu buộc phải dùng TPM rời, hãy thiết lập PIN hoặc passphrase cho BitLocker
  • Microsoft cũng khuyến nghị thiết lập PIN hoặc passphrase cho BitLocker ở những khu vực trong tổ chức cần mức bảo vệ dữ liệu cao hơn

1 bình luận

 
GN⁺ 2023-08-25
Ý kiến trên Hacker News
  • Mọi TPM đều hỗ trợ phiên được mã hóa để ngăn kiểu tấn công trung gian này. Chỉ cần dùng TPM2_StartAuthSession và chỉ định mã hóa cho từng lệnh trong phiên, nhưng BitLocker không dùng cách này, nên đây là một thất bại nghiêm trọng. Microsoft cần sửa
    Để so sánh, systemd dùng phiên được mã hóa khi dùng mã hóa đĩa LUKS cùng TPM: https://github.com/systemd/systemd/commit/acbb504eaf1be51572...

    • Đây thậm chí không hẳn là một cuộc tấn công trung gian đúng nghĩa, mà gần với nghe lén thụ động hơn
      Tôi không rành TPM nên muốn hỏi: phiên đã xác thực hoạt động như thế nào? Hệ điều hành chứng minh danh tính của mình với TPM bằng cách nào mà kẻ tấn công không thể giả mạo trong một cuộc tấn công trung gian thật sự? Các bí mật hoặc khóa được lưu ở phía hệ điều hành có vẻ phải nằm dạng văn bản rõ trên đĩa, vì lúc đó chưa có khóa mã hóa
      Ngay cả nếu hệ điều hành bằng cách nào đó xác minh danh tính của TPM và làm cho việc sửa vài tệp trên đĩa không thể vượt qua được, tôi vẫn không hiểu điều gì ngăn kẻ tấn công chạy cùng routine đó trong một trình giả lập. Trừ khi tích hợp với môi trường thực thi an toàn phía CPU như Intel ME hay SGX, có vẻ khó đạt được bảo mật thực sự bằng cách tiếp cận này, và nếu vậy thì ngay từ đầu có lẽ cũng không cần TPM
    • Tôi tò mò liệu thiếu sót đó có phải là cố ý không, và nếu có thì lý do là gì
    • Phiên đã xác thực hầu như vô dụng trong thực tế nếu không phải là một thiết bị được tích hợp hoàn toàn. Không có cách nào bảo đảm danh tính SRK, nên tấn công trung gian vẫn khả thi
  • Cũng có một bài khác từ năm 2021
    https://arstechnica.com/gadgets/2021/08/how-to-go-from-stole...
    Một số nhà sản xuất laptop cung cấp tùy chọn xóa TPM khi mở máy. Nếu bạn mở laptop để xem có thể nâng cấp RAM không, tốt nhất là bạn có quyền truy cập vào khóa khôi phục BitLocker hoặc có bản sao lưu

    • Lưu một bản sao khóa khôi phục ở đâu đó là thói quen tốt
    • Nhiều khả năng nó chỉ dựa vào một nút công tắc chống can thiệp đơn giản, và có thể dễ dàng bị vượt qua bằng cách cắt lớp nhựa mặt sau. Tôi không nghĩ họ đặt một cơ chế tinh vi kiểu đi dây khắp toàn bộ vỏ máy
    • Tôi chưa từng thấy phát hiện xâm nhập khung máy được bật mặc định trên thiết bị tiêu dùng. Có thể đó là sản phẩm đặt hàng số lượng lớn cho tài khoản doanh nghiệp. Những sản phẩm như vậy có thể được xuất xưởng với cấu hình mà bộ phận IT muốn
    • Ý bạn là trường hợp tháo ốc laptop và tiếp cận bên trong à?
      Tôi nghĩ cũng có thể tiếp cận bằng cách cắt nhựa. Kiểu như cảnh lấy ký sinh trùng trong Matrix
    • Việc ngày nay khó tìm laptop có RAM có thể nâng cấp đã trở thành chuyện để đùa. Một số dòng ThinkPad cũng vậy, còn laptop gaming thì thường vẫn làm được
  • Không có gì mới. Cấu hình mặc định không yêu cầu PIN, nhưng tài liệu của Microsoft mô tả nhiều kiểu tấn công và khuyến nghị thiết lập PIN BitLocker để chặn hoàn toàn chúng. Vì TPM ngăn vét cạn nên PIN có thể khá yếu cũng được
    Ví dụ: https://learn.microsoft.com/en-us/windows/security/operating...

    • Thú vị là theo tôi biết, Windows Defender hiện mặc định chặn các cuộc tấn công leo thang đặc quyền dựa trên accessibility. Behavior:Win32/AccessibilityEscalation
    • Tôi từng nghĩ TPM sẽ xóa vật liệu khóa sau X lần thử thất bại, không phải vậy sao?
  • Với BitLocker và kiểu mã hóa này, tôi luôn không hiểu mô hình trong đó khóa giải mã được hệ thống tự động cung cấp. Nếu cả chiếc laptop bị đánh cắp, BitLocker mang lại bảo mật gì? Với kẻ tấn công, hệ thống chỉ việc khởi động rồi yêu cầu mật khẩu tài khoản người dùng
    Theo tôi hiểu, nó có vẻ bảo vệ dữ liệu của tôi khi ai đó tháo ổ cứng khỏi laptop và cố chạy trên hệ thống khác. Vì sự hiểu lầm có thể ngớ ngẩn này mà tôi luôn đặt mật khẩu phải nhập thủ công cho BitLocker, và với LUKS tôi cũng luôn làm vậy. Tôi có nghĩ sai hoàn toàn không?

    • Kẻ tấn công phải vượt qua đăng nhập, trích xuất khóa từ bộ nhớ hệ thống, hoặc nếu có TPM vật lý thì dùng kiểu tấn công như trong bài này. Đây có khả năng là một cuộc tấn công tinh vi hơn nhiều so với kẻ trộm thông thường chỉ muốn trộm máy tính đắt tiền để kiếm tiền nhanh
      Thường thì họ nhiều khả năng sẽ xóa ổ rồi bán, chứ không thực sự thử tấn công cold boot. Tuy nhiên tất cả phụ thuộc vào mô hình đe dọa. Cá nhân tôi dùng mã hóa toàn bộ đĩa trên thiết bị cá nhân chủ yếu để giảm nhu cầu phải phá hủy vật lý thiết bị lưu trữ khi thải bỏ
      Ngay cả khi ổ cứng hỏng, tôi không cần phải thật sự tháo tung ra để chắc rằng dữ liệu của mình đã biến mất. Thiết bị của tôi thường ở chế độ ngủ khi ở bên ngoài, nên nếu ai đó muốn tấn công cold boot thì dù sao họ cũng có thể làm
    • Bạn không sai hoàn toàn, nhưng có thể đang bỏ sót rủi ro khóa có thể bị xuất ra
      Như bạn nói, nếu khóa giải mã được hệ thống tự động cung cấp thì khóa đó nằm trong RAM và sẵn sàng để kẻ tấn công xuất ra rồi tái sử dụng trên đĩa đã mã hóa. Tấn công cold boot[1] là một vector tấn công đáng đọc thêm để đánh giá xem có phù hợp với mô hình đe dọa của bạn không
      [1] https://en.wikipedia.org/wiki/Cold_boot_attack
    • Windows phải ngăn không cho bất kỳ ai truy cập tệp cho đến khi nhập đúng mật khẩu tài khoản. Vì vậy trên máy tính này, đĩa được giải mã, nhưng sau đó Windows sẽ chặn quyền truy cập
    • Tôi đoán nếu bạn không đặt mật khẩu cho mã hóa đĩa, thì trong kịch bản đó sẽ không có bảo vệ nào
  • Nếu khóa đi qua một bus dùng chung, điều đó có nghĩa là mọi thành phần trong hệ thống đều có thể chặn khóa dễ dàng như logic analyzer này sao? Nghe như ác mộng về bảo mật chuỗi cung ứng

    • Mục đích của kiểu mã hóa này là để có thể bán hoặc tái sử dụng ổ cứng đã tháo rời mà không gây rủi ro dữ liệu
      Nếu bất kỳ ai cũng có thể khởi động laptop và truy cập ổ cứng đã được giải mã, thì việc sniff khóa trước đó khác gì? Nếu đã có thể khởi động laptop thì dù sao cũng đã truy cập được kết quả cuối cùng rồi
    • Nó được chia sẻ giữa một vài thành phần, nhưng hoàn toàn không phải tất cả. Ngày nay thường chỉ có boot flash, TPM và chính CPU đóng vai trò bus master là gắn trên SPI bus
  • Nếu muốn BitLocker bảo vệ trong tình huống ai đó đánh cắp laptop, thì dù sao cũng phải dùng mật khẩu và phải tắt chế độ sleep, chỉ dùng hibernate thay vì sleep

    • Điều đầu tiên trước bài này không hẳn là hoàn toàn rõ ràng. Laptop bị đánh cắp thực ra là một trong những nhóm mối đe dọa yếu nhất[1] mà mã hóa toàn bộ đĩa có ý nghĩa, và Windows đã quảng bá mạnh việc không yêu cầu gì ngoài mật khẩu tài khoản thông thường
      Vậy phần cứng “đáng tin cậy” của TPM hiện thực sự đang làm gì? Các phép đo boot cũng có thể bị giả mạo sao? Hơn nữa chuyện này ngớ ngẩn đến khó tin. Tại sao vật liệu khóa lại chạy trên bus dưới dạng plaintext? Không hề có thứ gì như giao thức trao đổi khóa cả
      [1] Ở đây cũng có nói đến xóa an toàn, đó còn là trường hợp yếu hơn nữa. Nhưng nếu trong mã hóa toàn bộ đĩa có một EEPROM có thể rút khỏi socket và phá hủy vật lý, thì phần đó cũng được giải quyết hiệu quả tương tự
  • Tôi tò mò họ đã dùng phần mềm nào để biến tín hiệu thô thành 0 và 1. Trước đây tôi từng có một dự án tương tự: đọc dữ liệu số từ băng cassette thập niên 80. Tôi đã có được file .wav của băng khá ổn, nhưng vẫn chưa tìm được công cụ hay thư viện phù hợp để biến nó thành 0 và 1
    Tất nhiên phần thật sự thú vị sẽ bắt đầu sau khi giải mã được các số 0 và 1. Tôi biết bit được mã hóa thế nào, đó là điều chế dịch tần[0]. Điều tôi chưa biết là nên dùng gì để giải mã nó thành một bit stream mà tôi có thể xử lý tiếp
    [0] https://en.wikipedia.org/wiki/Frequency-shift_keying

    • Với việc giải mã băng FSK cũ, nên xem thử bộ lọc Goertzel trượt. Đây là bộ lọc dễ triển khai, trích xuất biên độ của một bin tần số cụ thể trong cửa sổ trượt, và thường được nhắc đến trong tài liệu giải mã DTMF
      Có thể so sánh đầu ra của một cặp bộ lọc như vậy để tạo đầu ra số. Cũng có thể dùng biến đổi Fourier rời rạc trượt thưa, nhưng việc nội suy giữa các bin tần số sẽ phiền hơn, trong khi bộ lọc Goertzel xử lý phần đó giúp bạn
    • Đây là một lĩnh vực lớn gọi là xử lý tín hiệu số, và về bản chất là việc modem hoặc bộ chuyển đổi analog-sang-digital của sound card thực hiện
      Tôi không biết có một thuật toán hay phần mềm đơn lẻ nào có thể biến bất kỳ tín hiệu thô nào thành byte. Bạn phải xác định tín hiệu dùng kiểu điều chế nào, rồi tìm decoder tương ứng hoặc tự viết. Thông thường sẽ có lọc và nhiều thuật toán toán học, nhưng chương trình giải mã cơ bản thường khá ngắn và đơn giản
      Đây là một kỹ năng khá thú vị để học, vì cùng các kỹ thuật đó có thể dùng ở đủ mọi nơi. Ví dụ sau khi học một chút DSP, tôi mở ra được rất nhiều việc có thể làm trong truyền thông vô tuyến, âm nhạc và thiết kế âm thanh, xử lý ảnh và video
    • Chỉ đọc bài thì có vẻ dễ. Khi clock chuyển từ thấp lên cao, mức hiện tại của đường dữ liệu là giá trị bit, và để tìm điểm bắt đầu thì chỉ cần tìm một bit 1 và bảy bit 0
    • Có lẽ nên xem Pulseview https://github.com/sigrokproject/pulseview và các phần khác của dự án Sigrok https://github.com/sigrokproject
      Hoặc vì tác giả có nhắc đến DSlogic, có thể có một bản fork của các chương trình đó do nhà sản xuất logic analyzer này làm
    • Các routine nạp dữ liệu thời đó chỉ đếm số lần zero-crossing DC rồi đổi thành 0 nếu có X lần giao cắt, thành 1 nếu có Y lần giao cắt, chứ không quan tâm tần số hay biên độ
      Tín hiệu thô thường được đưa vào Schmitt trigger để triển khai hysteresis nhằm có cạnh ổn định. Làm vậy sẽ bù được cực tính tín hiệu băng và sai lệch motor
  • Thật mỉa mai ở đoạn “dùng TPM vật lý riêng thực ra làm giảm bảo mật”
    Laptop của tôi năm 2015 không có TPM vật lý, và khi định bật thì nó hiện “Allow BitLocker without a compatible TPM (requires a password or a startup key on a USB flash drive)”, nên tôi đã nghĩ như vậy kém an toàn hơn. May là dù sao tôi cũng không dùng BitLocker

  • Thật buồn cười là mánh kiểu học sinh tiểu học đổi tên Command Prompt thành trình xử lý trợ năng như thời Windows Vista đến giờ vẫn còn dùng được nguyên xi
    Nếu thứ gì đó chạy với quyền admin mà không cần đăng nhập, người ta sẽ tưởng Windows sẽ xác thực, nhưng Windows trông như 75% là diễn kịch bảo mật, 25% còn lại cũng là một kiểu diễn kịch khác

  • Cùng kỹ thuật này đã được mô tả vào năm 2021:
    https://dolosgroup.io/blog/2021/7/9/from-stolen-laptop-to-in...