Cách truy cập root giường Sleep Number
(dillan.org)- 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
- Trên Linux và Mac có thể dùng
- Ổ 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ầnrun set_bootargs;để chuyển sang đặt tham số khởi động thủ công - Không thể sửa trực tiếp script
/initvì nó nằm trong bootrom đã được băm, nên dùngbootargsđể thay đổi nội dung/initkhi 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
- Script mặc định tìm một tệp mã hóa được giải mã bằng cụm
- 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 khi khởi động, nếu thấy prompt
- 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ùnged25519
- Lệnh ví dụ là
- 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
simpleHTTPServercung cấp các chức năng cần thiết
script_server.pymở 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
/initcủ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
/etcgố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àotmp/etc/init.dcủ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/bamstattrong 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
/biocó 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ườngPSNl,PSNr: truy vấn giá trị hiện tại của bên trái/phải giườngPSNX: 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ênPSNS&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ùngoffđể tắtLBPL,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ênLRLE&arg=on,LRRE&arg=off: thay đổi thiết lập Responsive Air trái/phảiMFST: truy vấn vị trí đầu và chânMFUL,MFUR,MFFL,MFFR: đặt vị trí đầu/chân trái/phảiMFO3,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ảiSBAS: đặt giá trị chuẩn của giường
/bio?arg=helphiể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 đó
- Nếu thêm lệnh làm đối số thứ hai khi gọi
- Script
biocũ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 resethoặc điều khiển radio - Trong phiên bản
biomà tác giả dùng, thứ tự mụcMFSOtrongLISTbị sai, nên muốn gọi được thì phải chuyển nó lên vài dòng
- Cần thận trọng với các lệnh có tính phá hủy như
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
Ý 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
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
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 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à ;)
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
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
“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ờ”
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
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
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
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 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
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
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
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”
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
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