2 điểm bởi GN⁺ 2024-07-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • Nếu giành được quyền truy cập root trên Sleep Number Hub bằng UART console và biến môi trường U-Boot, có thể tạo đường điều khiển cục bộ không đi qua máy chủ SleepIQ
  • Plugin Homebridge hiện có gọi SleepIQ API mỗi 5 giây; khi quy mô lên tới hàng nghìn người dùng, việc này tạo tải lên mạng Sleep Number và bị yêu cầu vô hiệu hóa
  • Thiết bị mục tiêu là Sleep Number Hub 360SIQ01D; các điều kiện then chốt gồm chân UART J16, console 115200 baud, ổ USB FAT32 hoặc Ext3, và đăng ký khóa công khai SSH
  • Sau khi có quyền root, có thể tận dụng Python 2.7.18 của Hub và /bam/scripts để xử lý thiết lập và trạng thái giường trong mạng cục bộ thông qua máy chủ HTTP ở cổng 8000
  • Hub có thể mở đường hầm ngược SSH tới máy chủ Sleep Number, nên khi điều khiển cục bộ đã đủ dùng, an toàn hơn là ngắt kết nối Internet bên ngoài và dùng Bluetooth hoặc điều khiển nội bộ

Cơ duyên tìm cách truy cập cục bộ

  • Mục tiêu là điều khiển giường Sleep Number trong mạng cục bộ mà không đi qua máy chủ SleepIQ
  • Plugin homebridge được tạo trước đó cho phép điều khiển thiết lập giường từ HomeKit hoặc tự động hóa
    • Đặc biệt, giá trị bed presence cho biết có người trên giường hay không rất hữu ích cho các tự động hóa như tắt đèn hoặc khóa cửa
  • Plugin gọi SleepIQ API mỗi 5 giây; khi số người dùng tăng lên hàng nghìn, nó tạo tải lên mạng Sleep Number
    • Sleep Number đã yêu cầu vô hiệu hóa plugin
    • Branding của kho lưu trữ cũng có vấn đề vì có thể trông giống như một công cụ chính thức của Sleep Number
  • Sau đó, công việc hiện có được tiếp nối bằng plugin homebridge-bed-control mới
    • Plugin mới mặc định vô hiệu hóa theo dõi bed presence và thêm cảnh báo trước khi bật

Đường truy cập tìm thấy trên phần cứng Hub

  • Ban đầu đã xem xét header J10 gần CPU nhưng không lấy được dữ liệu UART
    • Với cấu hình CPU đó, các đường UART không được đưa ra ngoài
  • Để tìm tín hiệu UART ở header J16 phía dưới bo mạch, tác giả nối logic analyzer vào 10 chân header
  • Khi kết nối thiết bị UART-TTY, có thể truy cập console của thiết bị
  • Tác giả dump flash để xem hệ thống tệp và lỗ hổng, nhưng không tìm thấy backdoor cho phép bất kỳ ai đăng nhập nếu không có UART
  • Thay vào đó, tác giả phát hiện backdoor bảo trì cho phép Sleep Number SSH vào Hub
    • Vì Hub được kết nối vào mạng gia đình nội bộ, đường truy cập này có thể dẫn vào mạng nội bộ
    • Nên ngắt kết nối Wi‑Fi và dùng điều khiển Bluetooth nhiều nhất có thể

Vật dụng chuẩn bị và thiết bị mục tiêu

  • Quy trình được thực hiện trên mẫu Sleep Number Hub 360SIQ01D
  • Thiết bị cần có là thiết bị UART-TTY và dụng cụ kết nối bo mạch
    • USB-C to UART hoặc USB-A to UART
    • Raspberry Pi Pico W có thể được lắp cố định bên trong để truy cập console từ xa khi SSH không hoạt động
    • Header chân 2,54mm và mỏ hàn, hoặc kẹp PCB clip clamp
  • Cần serial console để giao tiếp với bo mạch
    • Trên Linux và Mac có thể dùng minicom
    • Trên Windows có thể dùng PuTTY
  • Ổ flash USB-A phải được định dạng FAT32 hoặc Ext3
  • Nếu Hub đang dùng đã cắm sẵn thiết bị USB, đó có thể là dongle Wi‑Fi; nếu thiếu thiết bị này, có thể xảy ra vòng lặp khởi động

Luồng chính của quy trình truy cập root

  • Thiết bị UART được nối vào header J16 của bo mạch
    • pin 1: TX, tín hiệu đi vào Hub
    • pin 2: RX, tín hiệu đi ra từ Hub
    • pin 3: ground
  • Serial console được đặt ở 115200 baud
  • Sau khi bật nguồn Hub, nhấn phím Space trong vòng 2 giây để dừng tự động khởi động
  • Trước tiên, cần sao lưu biến môi trường U-Boot bằng printenv -a
    • Vì có thể cần khôi phục giá trị mặc định, nên cần ghi lại các khác biệt so với môi trường hiện tại
  • Trong bootcmd, xóa phần run set_bootargs; để chuyển sang đặt tham số khởi động thủ công
  • Không thể sửa trực tiếp script /init vì nó nằm trong bootrom đã được băm, nên dùng bootargs để thay đổi nội dung /init khi chạy
    • Script mặc định tìm một tệp mã hóa được giải mã bằng cụm let_me_root
    • Thay dòng giải mã bằng giá trị đã giải mã để bỏ qua yêu cầu về tệp mã hóa
  • Lần khởi động đầu tiên cần ổ USB chứa tệp let_me_root
    • Sau khi khởi động, nếu thấy prompt root@bam-se:~# trên console thì đã vào shell root
  • Sau đó remount phân vùng root ở chế độ đọc/ghi và tạo tệp /root/let_me_root để duy trì quyền truy cập mà không cần USB

Thiết lập truy cập SSH

  • Sau khi có prompt root, thêm khóa công khai SSH vào /root/.ssh/authorized_keys để thiết lập truy cập mạng
  • Cần tạo khóa SSH trên máy cục bộ dùng để kết nối
    • Lệnh ví dụ là ssh-keygen -t ed25519
    • Phần mô tả khuyến nghị khóa ecdsa, nhưng ví dụ thực tế dùng ed25519
  • Sau khi thêm khóa công khai, kiểm tra kết nối theo dạng ssh root@$hub_ip -i <path to id_ed25519>
  • Nếu không kết nối được, cần kiểm tra định dạng và nội dung tệp authorized_keys
    • Tài liệu nói rằng tệp này phải có hai khóa

Tạo máy chủ điều khiển mạng cục bộ

  • Chỉ có quyền root vẫn khó thay thế chức năng điều khiển của ứng dụng giường, nên chạy máy chủ HTTP cục bộ bên trong Hub
  • Hub có sẵn Python 2.7.18
    • Hub có vẻ được cập nhật lần cuối vào năm 2018
    • Python 2.7.18 có gói simpleHTTPServer cung cấp các chức năng cần thiết
  • script_server.py mở máy chủ HTTP ở cổng 8000 và chạy các script trong /bam/scripts
    • Đường dẫn URL trở thành tên script
    • Có thể truyền nhiều tham số truy vấn arg để dùng làm đối số cho script
    • Kết quả thực thi được hiển thị trong trình duyệt
  • Sao chép script vào Hub theo dạng scp -O script_server.py root@$hub_ip:~
  • Để tự động khởi động sau khi reboot, cần gắn vào script khởi động hoặc thêm script rc.d

Thiết lập tự chạy sau khi khởi động lại

  • Instance OS đang chạy hoạt động bên trong chroot do script /init của bootloader tạo ra
  • Nhiều tệp hệ thống được lưu trên phân vùng tmpfs, nên dù sửa trực tiếp cũng không được giữ lại sau khi reboot
  • Nếu mount riêng phân vùng đĩa chứa tệp gốc, có thể sửa các tệp /etc gốc sẽ được sao chép sau khi reboot
  • Tạo init script dạng script_server.sh, sao chép vào Hub, rồi đặt vào tmp/etc/init.d của phân vùng root gốc
  • Thêm symlink vào rc0.d, rc3.d, rc4.d, rc5.d, rc6.d để script chạy ở thời điểm khởi động và tắt
  • Sau khi reboot, nếu truy cập http://$hub_ip:8000/bamstat trong trình duyệt và thấy thông tin trạng thái Hub, máy chủ đang hoạt động bình thường

Các điều khiển có thể thực hiện bằng script /bio

  • /bio có vẻ là script điều khiển chính của giường
  • Lệnh được truyền theo dạng /bio?arg=XXXX
  • Có thể truy vấn và đặt giá trị Sleep Number
    • PSNL, PSNR: truy vấn giá trị thiết lập cuối cùng của bên trái/phải giường
    • PSNl, PSNr: truy vấn giá trị hiện tại của bên trái/phải giường
    • PSNX: truy vấn giá trị thiết lập cuối cùng và giá trị hiện tại của cả hai bên
    • PSNS&arg=L100: đặt giá trị Sleep Number bên trái thành 100, khoảng giá trị là 5..100
  • Cũng có thể xử lý phát hiện hiện diện và thiết lập quyền riêng tư
    • SPAU: truy vấn thiết lập quyền riêng tư
    • SPAU&arg=on: bật thiết lập quyền riêng tư, dùng off để tắt
    • LBPL, LBPR, LBPX: truy vấn giá trị hiện diện bên trái, bên phải, cả hai bên
  • Cũng bao gồm Responsive Air, vị trí giường, đèn và chức năng làm ấm chân
    • LRSG: truy vấn thiết lập Responsive Air của cả hai bên
    • LRLE&arg=on, LRRE&arg=off: thay đổi thiết lập Responsive Air trái/phải
    • MFST: truy vấn vị trí đầu và chân
    • MFUL, MFUR, MFFL, MFFR: đặt vị trí đầu/chân trái/phải
    • MFO3, MFSO: trạng thái đèn dưới gầm hoặc ổ cắm và thiết lập độ sáng/hẹn giờ
    • FWGL, FWGR, FWSL, FWSR: truy vấn/đặt mức và hẹn giờ sưởi chân trái/phải
    • SBAS: đặt giá trị chuẩn của giường
  • /bio?arg=help hiển thị danh sách lệnh có thể chạy
    • Nếu thêm lệnh làm đối số thứ hai khi gọi help, sẽ hiện thông tin chi tiết của lệnh đó
  • Script bio cũng có foundation preset, thiết lập chống ngáy, điều khiển DualTemp và thông tin trạng thái
    • Cần thận trọng với các lệnh có tính phá hủy như factory reset hoặc điều khiển radio
    • Trong phiên bản bio mà tác giả dùng, thứ tự mục MFSO trong LIST bị sai, nên muốn gọi được thì phải chuyển nó lên vài dòng

Các khu vực có thể xem xét sau khi truy cập và lo ngại bảo mật

  • Các chức năng điều khiển giường tập trung trong thư mục gốc /bam
    • Xem các script trong đó có thể biết Hub hoạt động như thế nào
  • Tác giả đã cố tìm backdoor có thể truy cập không cần UART, nhưng các kênh truy cập rõ ràng đều đã đóng
  • Khi giao tiếp với máy chủ Sleep Number, Hub mở đường hầm SSH và cung cấp đường hầm ngược mà nhà phát triển có thể dùng để bảo trì
  • Vì người bên ngoài có khả năng kết nối trực tiếp vào mạng gia đình nội bộ, khi các script điều khiển mạng nội bộ đã đủ dùng, nên cân nhắc ngắt kết nối Internet bên ngoài của Hub
  • Một Progressive Web App đơn giản có thể trực tiếp thay thế ứng dụng SleepIQ cũng là ứng viên cho bước tiếp theo

1 bình luận

 
GN⁺ 2024-07-02
Ý kiến trên Hacker News
  • Khá là phi lý. Trước đây tôi từng dùng loại giường này, nhưng đó là trước khi mọi thứ trở nên thông minh. Có hai bộ điều khiển có dây nối với máy bơm, trên bộ điều khiển có màn hình hiển thị số và nút tăng/giảm
    Không cần Internet, không cần vi điều khiển nền Linux, giường cũng không thể bị hack, và vẫn ngủ thoải mái

    • Mỗi khi cảm thấy “đây đúng là phức tạp hóa quá mức đến vô lý”, tôi cố tưởng tượng xem nó có thể làm cuộc sống của ai đó đơn giản hơn đến mức nào
      Ví dụ, nếu có một dạng khuyết tật vận động nào đó, từ bệnh Parkinson cho đến liệt tứ chi, thì việc kết nối được với một bộ điều khiển chung hoạt động bằng giọng nói hoặc các phương thức nhập liệu chuẩn hóa có thể là một lợi ích cực lớn. Vì họ không phải đối mặt riêng lẻ với các giới hạn về khả năng tiếp cận khác nhau của từng sản phẩm
      Với người không bị hạn chế về thể chất, phần lớn thiết bị smart home trông gần như vô dụng, nhưng với người khác thì chúng có thể là dây cứu sinh
    • Nếu là loại giường như vậy thì tôi sẽ mua. Việc phải gắn thêm cả khả năng kết nối Wi‑Fi vào giường thì thật kỳ quặc. Như thế cần nhiều phần cứng hơn so với chỉ cắm vào ổ điện tường, nên tôi thấy thật điên rồ
  • Tôi tò mò về đoạn “khi hub giao tiếp với máy chủ Sleep Number, nó mở một đường hầm SSH và cung cấp đường hầm ngược để các nhà phát triển có thể truy cập vào hub khi cần bảo trì”
    Muốn xem họ dùng xác thực khóa công khai hay mật khẩu, và khi tunnel vào nhà thì dùng IP hay DNS. Nếu điều kiện vừa khớp, có vẻ có thể dựng nên cấu hình chiếm quyền DNS buồn cười nhất trong lịch sử nhân loại
    Mượn câu nói bất hủ của Homer Simpson: giường nâng lên rồi giường hạ xuống

    • Kiểu cũ: tấn công SIM swapping nhắm vào người nắm giữ tiền mã hóa
      Kiểu mới: vì giường Sleep Number được liên kết với thông tin đơn hàng, nên đột nhập vào Sleep Number để tìm mục tiêu, SSH vào giường của người đó, rồi pivot sang mạng gia đình để đánh cắp ví tiền mã hóa
      Dù sao thì tiền lúc nào cũng được giấu dưới nệm mà ;)
    • Nếu chủ giường không được thông báo về chuyện đó trước khi mua, chẳng phải họ nên kiện sao? Truy cập trái phép vào mạng và cài backdoor chẳng phải là tội phạm à?
  • Tại sao giường phải chạy Linux? Tại sao?
    Cảm giác như chúng ta đang sống trong dòng thời gian ngu ngốc nhất trong tất cả các dòng thời gian có thể. Một chiếc giường bình thường không có 1GB RAM và cả một hệ điều hành hoàn chỉnh thì có vấn đề gì? Ở đâu cũng vậy. Tìm một cái máy giặt không kết nối Wi‑Fi cũng đã là việc khó, và nghĩ đến chuyện 10 năm nữa lại phải làm việc đó thì thật kinh khủng
    Từ góc nhìn của một người đã đột nhập khoảng O(1000) thiết bị “thông minh”, dù để vui hay kiếm tiền, tôi không muốn mang những thứ như thế vào nhà. Nhưng vì những cơn điên như giường chạy Linux này, việc tránh chúng ngày càng khó hơn. Làm ơn dừng lại đi

    • Giường không cần phải phức tạp. Ngày xưa chỉ với Z80 và 32K RAM cũng đã làm được mọi việc cần làm trên giường. Ngày tôi mua chiếc giường đa nhiệm hợp tác đầu tiên thật sự là một cột mốc, và chăn mật độ cao đã thay đổi cuộc chơi
      Chỉ có điều tôi không nhớ nhung gì việc phải cầm đĩa vinyl trắng ra thư viện công cộng để lấy bản cập nhật phần mềm. Quên một cái là sinh rệp ngay
    • https://imgur.com/6wbgy2L
      “Sản phẩm công nghệ mới nhất tôi có là một chiếc máy in đời 2004, và tôi để sẵn một khẩu súng đã lên đạn để bắn nó ngay nếu nó phát ra âm thanh bất ngờ”
    • Lý do giường chạy Linux là vì chúng ta đang sống trong thời đại tự đo lường bản thân để có kết quả tốt hơn
      Một thế kỷ trước, chúng ta phát hiện ra kháng sinh, đó là bước tiến lớn. Sau đó chúng ta tìm ra nhiều bệnh rõ ràng và cách chữa rõ ràng, còn bây giờ những thứ còn lại là các vấn đề phức tạp và tinh vi. Chiếc giường này chạy Linux để cho bạn biết tình trạng giấc ngủ
      Nếu ngủ không ngon thì thường sẽ có nhiều tác động tiêu cực tuy nhẹ, và nếu biết được thì có thể khắc phục. Nó giống như làm một bài kiểm tra giấc ngủ cường độ thấp mỗi đêm, nên có thể là thông tin có giá trị
      Giường Sleep Number có giá vài nghìn đô la, nên nếu muốn tránh thì có lẽ vẫn tránh được
    • Tôi cũng có cảm giác tương tự. Điều may mắn là nhờ xu hướng này, tôi đã mua được nhiều món đồ cũ hơn, đồ đã qua sử dụng và có thể sửa chữa với giá rẻ hơn nhiều, đồng thời cũng dần học được vài sửa chữa nhỏ cho đồ điện tử cũ
      Rất có lợi cho ví tiền, và cảm giác hài lòng khi không đưa những món đồ còn dùng tốt ra bãi chôn lấp cũng rất lớn. Giảm dùng, tái sử dụng, tái chế — thứ tự đó đúng là thứ tự ưu tiên
    • Ít nhất thì nó không chạy Windows
  • Lúc đầu tôi hoàn toàn nghĩ bài này là về việc hack giường Eight Sleep, do một người không muốn nêu thẳng tên công ty vì lý do pháp lý
    Nhưng khi thấy bức ảnh “Number Sleep Hub” có vẻ thật sự tồn tại, tôi choáng luôn. Có tới hai công ty làm giường làm mát bằng nước, một là Eight Sleep và một là Sleep Number, dòng thời gian này kỳ quặc quá. Cảm giác bộ sinh số ngẫu nhiên của instance này đã nhận phải seed xấu

    • Tên Sleep Number xuất phát từ giá trị điều chỉnh độ cứng của nệm. Bạn chọn “sleep number” của mình, còn bạn đời thì chọn giá trị của họ ở phía bên kia giường
    • Tôi xem đây là một sự trùng hợp buồn cười, nhưng có vẻ Eight Sleep đã chọn một cái tên dễ bị nhầm với Sleep Number vừa đủ để không bị kiện ngay lập tức
    • Thương hiệu Sleep Number có lẽ đã tồn tại từ thập niên 80. Tôi chưa từng dùng, nhưng chắc chắn đó là một thương hiệu lâu đời. Nếu ở ngoài Mỹ thì có thể bạn chưa từng nghe tới
    • Giường Sleep Number về cơ bản có cấu trúc là một túi khí hình chữ nhật khổng lồ dạng nệm, nằm trong một ngôi mộ bằng foam
      https://i.ytimg.com/vi/pMiTq6YkJ2c/maxresdefault.jpg
      Nói trắng ra, người ta đang trả vài nghìn đô la cho một chiếc giường hơi điều chỉnh được loại cao cấp, bên trên phủ foam
    • Tôi chưa từng nghe cả hai, nên cứ tưởng tiêu đề là ẩn dụ về “cách lấy quyền root vào não để cải thiện chất lượng giấc ngủ”
      Tôi hy vọng những chiếc giường như thế có điều khiển vật lý có thể sờ dùng được cả trong bóng tối. Nếu đang cố ngủ mà muốn điều chỉnh lại phải đưa smartphone lên trước mặt, thì tôi nghi ngờ liệu các hãng làm giường và nệm có thật sự hiểu điều gì tốt hay xấu cho chất lượng giấc ngủ hay không
  • Cũng có cách truy cập tương tự trên Eight Sleep Pod 3 [0]. Một số mẫu có thẻ MicroSD có thể chỉnh sửa, nên cần ít phần cứng bổ sung hơn
    Cách trong bài có thể là một phương pháp tốt để lấy quyền root trên các Pod không có thẻ. Nhưng điều tôi vừa phát hiện là Eight Sleep có ký các bản cập nhật firmware, nhưng cũng gửi kèm khóa riêng dùng để ký các bản cập nhật đó trong cùng gói
    [0]: https://github.com/bobobo1618/ninesleep

    • Trớ trêu là thấy cái này lại khiến tôi muốn mua một cái hơn. Nếu có thể đưa thiết bị thông minh về chạy cục bộ, hoặc điều khiển bằng Home Assistant, rồi ngắt kết nối Internet, thì trông cũng không tệ lắm
      Dĩ nhiên 2.000–4.000 USD là đắt, nhưng nếu coi là chi phí một lần dùng khoảng 10 năm thì hợp lý. Nhưng đã trả 4.000 USD mà còn phải trả thêm 25 USD/tháng thì thật vô lý
  • Không biết có ai đã làm điều tương tự với Eight Sleep chưa. Việc không thể chỉnh nhiệt độ giường chỉ vì mất Internet thật sự gây khó chịu sâu sắc

    • Đây là kiểu địa ngục mới gì vậy. Tại sao lại phải kết nối Internet?
    • Trường hợp của tôi thì chăn giải quyết được 95%, còn ở nhà nghỉ trượt tuyết thì một tấm đệm điện rẻ tiền xử lý nốt 5% còn lại
    • Tôi từng định mua Eight Sleep, nhưng biết họ làm trò này thì mất hứng ngay. Tôi không định trả hơn 1.000 USD cho một tấm phủ nệm rồi còn phải trả “tiền thuê” để món đồ hoạt động
  • Tôi sẽ không mua Sleep Number
    Tôi đã ngủ trên nệm hơi bơm được vài năm, nhưng sau khi nhà sản xuất bắt đầu thuê ngoài sang Trung Quốc, đường may của các vách ngăn bên trong đã bung ở hai tấm nệm

  • Mong mọi người ngừng lan truyền mấy câu nhảm kiểu “làm theo hướng dẫn này sẽ phải sửa các tệp nội bộ của hub Sleep Number và làm mất hiệu lực bảo hành”
    Cũng như các nhãn “gỡ ra là mất bảo hành” không thể được thực thi về mặt pháp lý, không có chuyện bảo hành sản phẩm bị tự động vô hiệu trừ khi có lạm dụng hoặc bảo trì kém
    Khi giường thông minh hỏng, nhà sản xuất không thể thoát nghĩa vụ bảo hành chỉ vì bạn từng động vào bộ điều khiển. Điều đó bao gồm cả bảo hành ngụ ý. Trách nhiệm chứng minh rằng người tiêu dùng đã làm hỏng sản phẩm, dùng theo cách “không hợp lý”, hoặc không bảo trì đúng cách thuộc về nhà sản xuất
    Nếu bạn cố nối JTAG rồi lỡ nối cầu 5V vào mạch logic 3,3V và làm cháy bộ não của chiếc giường, thì đó là lỗi của bạn
    Nhưng nếu bộ nguồn nổ làm hỏng bộ điều khiển, thì việc bạn đã gắn header JTAG, dán sticker mắt lồi và sơn nó màu hồng là không liên quan. Họ phải sửa
    Ngay cả khi bạn sửa firmware, nhà sản xuất phải chứng minh rằng sửa đổi đó là nguyên nhân gây hỏng
    Bạn sẽ không kỳ vọng bảo hành laptop bị vô hiệu chỉ vì chơi game làm máy nóng nhiều. Cài Firefox hay cài Linux cũng vậy. Không có lý do gì để nghĩ rằng quy tắc thay đổi chỉ vì thiết bị “ngu” hơn một chút

    • Luật trên giấy và luật ngoài thực tế là khác nhau. Nếu nhà sản xuất từ chối thực hiện bảo hành, khách hàng có rất ít việc có thể làm
  • Tiếp theo chắc sẽ là ransomware. “Nếu không trả 1.000 USD, ta sẽ khiến ngươi không ngủ được trên giường của mình trong tháng tới”

    • Tiếp theo chẳng phải là gói đăng ký sao?
  • Hãy xem vài sự thật
    Giường Sleep Number có cảm biến phát hiện nhịp tim. Nó làm vậy bằng cách phát hiện chênh lệch áp suất trong nệm hơi. Về cơ bản chẳng khác gì micro, và khá nhạy

    • Thật sự có thể phát hiện nhịp tim bằng cảm biến áp suất à? Có vẻ nhiễu quá nhiều nên dữ liệu không dùng được
      Tìm thử thì có vẻ họ kết hợp phân tích thống kê khá hợp lý để thu được dữ liệu đủ chính xác. Thú vị thật