6 điểm bởi GN⁺ 2025-08-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Để giải quyết trải nghiệm chậm chạp của ứng dụng PureGym và quy trình vào cửa rườm rà, tác giả đã tự tối ưu hóa bằng Apple Wallet
  • Mã QR hiện có là một cách vào cửa kém hiệu quả vì mỗi lần đều phải mở ứng dụng và tải thông tin, mất khoảng 47 giây
  • Thông qua nhiều bước kỹ thuật như reverse engineering, sử dụng mitmproxy và framework PassKit, tác giả đã triển khai thẻ Wallet có thể tự động làm mới
  • Trong quá trình này, tác giả xác nhận được cách PureGym vận hành nội bộ qua những gì lộ ra trên web, như lỗ hổng bảo mật của mã PIN, cấu trúc xác thực API và thông tin vị trí các chi nhánh
  • Cuối cùng, tác giả tạo ra trải nghiệm người dùng vào cửa chỉ trong 3 giây, đồng thời làm rõ đây chỉ là thử nghiệm cá nhân và không phải dịch vụ chính thức

47 giây: khởi đầu của sự bất tiện

  • Vào 11:15 sáng một ngày trong tuần, tác giả mất 47 giây để mở ứng dụng ở lối vào PureGym
  • Tín hiệu yếu, phải kết nối Wi‑Fi rồi mở ứng dụng, bỏ qua đủ loại thông báo đẩy và ưu đãi đặc biệt thì mã QR mới hiện ra
  • Phải chờ khá lâu để mã QR thực sự xuất hiện, khiến tác giả ngại ngùng vì những thành viên khác đang đứng nhìn
  • Nếu lặp lại 6 lần mỗi tuần, đây là trải nghiệm lãng phí tổng cộng 282 giây mỗi tuần
  • So với trải nghiệm gần như không ma sát như Amazon Fresh, UX vào cửa của PureGym bị tụt hậu rất xa

Bí ẩn của mã PIN đã tồn tại 8 năm

  • Tác giả đã dùng cùng một mã PIN 8 chữ số suốt 8 năm
  • Mã PIN này không hết hạn cũng không thay đổi
  • Trong khi đó, mã QR trong ứng dụng lại được thay bằng giá trị mới mỗi phút
  • Có một mâu thuẫn lớn giữa mức độ bảo mật thực tế và cách triển khai thực tế
  • Cách dùng PIN được giữ nguyên quá lâu, trong khi chỉ riêng mã QR bị bảo vệ nghiêm ngặt, tạo nên một hiện tượng kiểu "trình diễn bảo mật"

Hiểu PureGym bằng mitmproxy

  • Ban đầu, tác giả định đưa ảnh chụp màn hình mã QR vào Apple Wallet để dùng, nhưng lập tức không hoạt động
  • Mã QR của PureGym được tạo động, hết hạn sau khoảng 1 tuần nhưng trong ứng dụng lại được làm mới mỗi phút
  • Tìm kiếm các repo liên quan đến "PureGym" trên GitHub giúp tác giả phát hiện cấu trúc xác thực API
    • Mã PIN 8 chữ số dùng để đăng nhập cũng chính là mật khẩu API
    • Thông tin xác thực cơ bản được mã hóa bằng Base64 cũng có mức độ an toàn thấp
  • Để phân tích lưu lượng của ứng dụng, tác giả chặn các yêu cầu bằng công cụ proxy như mitmproxy
    • Cấu trúc JSON của mã QR gồm part1 (id cố định), part2 (timestamp), part3 (salt để làm mới)
    • API còn hướng dẫn đầy đủ cả thời điểm làm mới lẫn điều kiện hết hạn
    Quảng cáo

PassKit: tiềm năng của Apple Wallet

  • Thẻ Apple Wallet không phải thẻ tĩnh mà là một cấu trúc kiểu mini app có thể tự làm mới, gửi thông báo đẩy và phản ứng theo vị trí
  • Việc triển khai PassKit cần có đặc tả JSON, tài nguyên hình ảnh, chữ ký chứng chỉ và web service cho cập nhật thời gian thực
  • Cần cấp Pass Type ID và chứng chỉ WWDR từ cổng nhà phát triển của Apple
  • Việc ký và quản lý chứng chỉ khá phiền phức, nhưng nếu làm được thì trải nghiệm trên thiết bị thực rất mượt mà

Xây dựng backend bằng Swift

  • Dù thông thường sẽ dùng Node.js, tác giả đã tự triển khai web service PassKit bằng Vapor dựa trên Swift
    • Khi cần cập nhật thẻ, hệ thống cung cấp tự động qua silent push
    • Nhờ đó có thể hiện thực hóa việc làm mới thẻ một cách tự nhiên mà người dùng không hề nhận ra

Tự động hóa vị trí toàn bộ PureGym trên toàn quốc

  • Thẻ Apple Wallet có thể tự động hiển thị ở vị trí được chỉ định
  • Trang web chính thức của PureGym không có tọa độ chi tiết, nhưng API lại cung cấp danh sách tọa độ các chi nhánh trên toàn quốc
  • Tác giả phân tích toàn bộ tọa độ chi nhánh và chỉ định chi nhánh gần nhất cho từng thẻ
  • Nhược điểm: nếu PureGym nằm trong trung tâm mua sắm, thẻ vẫn có thể hiện lên ngay cả khi chỉ đi mua sắm, gây một chút phiền toái
Quảng cáo

Đồng bộ với Apple Watch

  • Thẻ Apple Wallet tự động đồng bộ sang Apple Watch mà không cần thao tác bổ sung
  • Chỉ cần bấm hai lần trên cổ tay rồi quét, tổng thời gian đến lúc vào cửa rút xuống còn 3 giây
  • Giảm được hơn 93% thời gian

Thay đổi nhìn qua con số

  • Thời gian vào cửa bằng ứng dụng PureGym cũ: 47 giây
  • Thời gian vào cửa bằng thẻ Apple Wallet: 3 giây
  • Thời gian tiết kiệm trung bình mỗi tuần: 4,4 phút (3,8 giờ mỗi năm)
  • Các thành viên xung quanh đã hỏi 23 lần rằng "có ứng dụng như vậy à", và tác giả đều giải thích rằng đây là giải pháp không chính thức
  • Dù có người muốn dùng, tác giả không có kế hoạch phát hành vì vấn đề bản quyền/chính sách dịch vụ

Phần thưởng thêm: tích hợp Home Assistant

  • Thông qua endpoint số người trong phòng tập của API PureGym, tác giả hiển thị mức độ đông đúc hiện tại của phòng gym trên dashboard IoT
  • Có thể quyết định quay lại vào giờ vắng người hơn dựa trên dữ liệu, qua đó tăng hiệu quả và động lực tập luyện

Thực tế kỹ thuật và khía cạnh đạo đức

  • Dù chỉ bắt đầu từ việc giải quyết một sự bất tiện cá nhân, đây lại là khu vực mà bên trong PureGym không cải thiện suốt nhiều năm
  • Một prototype được tạo ra từ bên ngoài tổ chức đôi khi giải quyết vấn đề nhanh hơn cả roadmap chính thức
  • Tuy vậy, về mặt chính thức thì điều này có thể vi phạm điều khoản sử dụng và PureGym có thể chặn bất cứ lúc nào
  • Tác giả tuyệt đối không tự động hóa/chia sẻ cho người khác, chỉ dùng cho thử nghiệm cá nhân và tuân thủ các nguyên tắc như dùng cache để đảm bảo ổn định

Bước tiếp theo và lời kết

  • Về sau có thể đề xuất các ý tưởng mở rộng như "thông báo đẩy xấu hổ"
  • Giá trị thực tế có thể nhỏ, nhưng tác giả hài lòng vì đã tối ưu được 3,8 giờ mỗi năm cho những "thao tác không cần thiết"
  • Nếu PureGym triển khai chính thức, nhiều người dùng hơn sẽ được hưởng sự tiện lợi này
  • Đây được xem là một trường hợp tạo ra "trải nghiệm không chính thức nhưng hiệu quả"

1 bình luận

 
GN⁺ 2025-08-16
Ý kiến Hacker News
  • Tôi nghĩ đây là một bài viết thực sự thú vị và truyền cảm hứng, thể hiện rất rõ bản chất của một kỹ sư, và cho thấy OP là một hacker đích thực
    Khi ở Mỹ 3 tháng, tôi đã đăng ký PureGym và nhận được mã PIN, sau đó hủy gói thành viên, nhưng rồi Chrome báo với tôi rằng mã PIN PureGym đã bị lộ
    Hai năm sau tôi quay lại Mỹ và lại nhận đúng mã PIN đó, tôi nghĩ đây là một vấn đề bảo mật cực kỳ nghiêm trọng
    Ứng dụng PureGym và token của nó cũng khá thú vị, và tôi còn phát hiện một lỗ hổng bảo mật trong hệ thống kích hoạt ghế hydro massage, vì nó chấp nhận bất kỳ mã PIN nào
    • Việc Chrome thông báo mã PIN PureGym bị lộ có lẽ là dương tính giả, chuyện này có thể xảy ra khi Chrome dùng API HaveIBeenPwned
      Ví dụ, mã PIN như 87623103 được chuyển thành giá trị băm 558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEE và nếu tra trong phạm vi băm của HaveIBeenPwned thì thực sự có nhiều lần bị lộ
  • Đây là chuyện chỉ cần nghĩ một lần là thấy có vấn đề: bàn phím vật lý đặt ngoài trời, ở nơi bị thời tiết nước Anh, protein shake và sự hối hận phủ lên, thậm chí còn có thể bị phát trực tiếp lên TikTok qua chuông cửa Ring của nhà ai đó. Thế mà nó vẫn chấp nhận mã PIN cũ của tôi không chút vấn đề, trong khi mã QR kỹ thuật số thì lại cần mức xoay vòng mã hóa khiến cả NSA cũng phải trầm trồ
  • Tôi rất thích đọc những câu chuyện như thế này, thay vì chờ ứng dụng hoạt động bình thường thì tự nhớ luôn mã PIN. Vì vậy tôi có thể vào còn nhanh hơn cả cách OP đề xuất, lại không cần thiết bị hay dịch vụ riêng nào nên còn tiện hơn
  • Khi đọc câu “không triển khai Apple Wallet cũng có lý do của nó”, nhìn ảnh chụp màn hình ứng dụng PureGym thì có vẻ nó thực chất chỉ là một lớp bọc mỏng quanh trang web di động, hoặc dùng công nghệ kiểu Flutter. Khả năng họ có lập trình viên nội bộ xử lý được cả những chi tiết tinh vi của API Apple có vẻ là cực thấp
    • Đây chính là cốt lõi, nghề chính của PureGym là lôi kéo càng nhiều người đăng ký dịch vụ càng tốt và khiến việc hủy gói trở nên khó khăn, chứ không phải phát triển phần mềm. Nếu may mắn thì họ có một lập trình viên web nội bộ chỉ vừa đủ để trông nom website và cơ sở dữ liệu, rồi thuê ngoài để làm cho nó trông giống ứng dụng, còn nếu xui thì toàn bộ công việc web đều giao cho bên outsource và mỗi lần muốn sửa một chữ trong tiêu đề cũng phải trả thêm phí
    • Nhưng tôi vẫn thắc mắc tại sao họ không học được, khi đã có Google, Stack Overflow và các công cụ như LLM mà vẫn không có cải thiện gì. Có lẽ là vì chẳng có ai thực sự quan tâm đến UX, hoặc đội backend đã rời đi từ lâu và những gì còn lại chỉ là số ít kỹ sư giá rẻ để duy trì tối thiểu
    • Nếu thêm Apple Wallet thì cũng phải hỗ trợ Android Wallet, nên lượng mã cần quản lý sẽ tăng lên. Dù vậy ít nhất họ vẫn có thể làm cho ứng dụng luôn hiện mã QR ngay khi mở lên
    • Tôi cũng có ứng dụng PureGym trên điện thoại, và đúng là nó giống như một ứng dụng chỉ bọc quanh website PureGym
  • Quá chuẩn, mã PIN 8 chữ số mở cửa phòng gym lại chính là mật khẩu API, và phần lớn người dùng còn không tự đặt nó. Tôi chỉ hy vọng có rate limit cho các lần thử thất bại. Có vẻ chỉ cần biết địa chỉ email là có thể vào API ngay. Tôi cũng tò mò xem phạm vi quyền có được giới hạn cẩn thận không
    • Tôi là OP
      Với câu hỏi có thể truy cập API ngay hay không thì là đúng vậy, thực tế khi dùng ứng dụng và website tôi chưa từng bị rate limit, và hệ thống khá rộng tay với các lần thử thất bại
      Scope được giới thiệu trong bài cũng giống hệt những gì ứng dụng chính thức và các client không chính thức trên GitHub đang dùng
      Khả năng có thêm scope khác là rất thấp, cũng có thể tham khảo PureGym PHP WrapperPureGym Attendance Python
  • Tôi đã gặp rất nhiều cuộc thảo luận về roadmap ứng dụng kiểu PureGym trong ngành IT
    Kiểu như “nếu làm tính năng này thì chúng ta sẽ phải tự chịu trách nhiệm về nó”
    Và mọi người thường đùa lại là “đúng đấy, vậy cho vào roadmap năm 2028 nhé”
    • Các cuộc họp bộ phận của tôi cũng y hệt, mỗi khi nói về roadmap và kế hoạch thì trọng tâm luôn là “việc này có giúp doanh thu không, hay chỉ tốn tiền”
      Công việc phải làm và wishlist vốn đã dài nên rất khó thêm tính năng mới
      Tôi nghĩ điều tốt nhất PureGym có thể làm lúc này là đưa cho lập trình viên làm ra ứng dụng này vài nghìn bảng Anh cùng quyền sử dụng miễn phí trọn đời
  • Tôi tò mò chi phí cho chứng chỉ Pass Type ID do Apple Developer Portal cấp là bao nhiêu
    Tôi muốn tạo Apple Wallet pass nhưng thấy việc thiết lập tài khoản nhà phát triển và các chi phí bổ sung khá áp lực
    • Theo những gì tôi biết thì nó đã nằm trong gói đăng ký nhà phát triển cơ bản, chỉ là bạn phải gia hạn đăng ký hằng năm để tiếp tục duy trì
  • Nếu cứ mỗi phút lại nhận thông báo đẩy để lấy mã mới thì có thành vấn đề về pin không nhỉ
    • Đọc bài thì có vẻ việc làm mới mã diễn ra mỗi tuần một lần, nên tối đa chắc cũng chỉ là mỗi tuần một lần
    • Thông báo đẩy có cái gọi là background mode, nghĩa là chỉ được xử lý khi điện thoại đã sẵn sàng
      Khi pin yếu hoặc ở chế độ tiết kiệm pin thì nó thậm chí sẽ không được chuyển tới, vì cơ chế này được tạo ra để giảm tiêu hao pin xuống mức tối thiểu
      Các thông báo quan trọng hơn thì phần tử UI bắt buộc phải được hiển thị và chúng sẽ đến bất kể tình trạng tiết kiệm pin
  • Bài viết rất vui và đầy chi tiết kỹ thuật nên đọc rất thích