1 puan yazan GN⁺ 2024-07-28 | 1 yorum | WhatsApp'ta paylaş
  • Yaygın Casio F-91W’ye Sensor Watch yedek kartı takarak Google ve Github için 2FA TOTP kodlarını bilekten görmeyi sağlayan bir hacking projesi
  • Mevcut LCD, düğmeler ve piezo buzzer aynı kalıyor; yalnızca ARM Cortex M0+ kartı değiştirilerek Bluetooth olmadan da programlanabilir saat yüzleri ve yardımcı uygulamalar çalıştırılıyor
  • TOTP saat yüzü, QR koddan Base32 secret’ı çıkarıp onaltılık byte’lara dönüştürdükten sonra totp_face.c içine koyup movement’ı yeniden build ederek çalışıyor
  • Birlikte geliştirilen ratemeter saat yüzü, ALARM düğmesine basma aralıklarından dakika başına hızı hesaplıyor; 500/min üstünü Hi, 1/min altını Lo olarak gösteriyor
  • Aylarca pil ömrü, mevcut Casio kasası, web tabanlı wasm emülatörü ve değiştirilebilir kaynak ağacı bir araya gelerek F-91W’yi küçük bir bilek hacking platformuna dönüştürebiliyor

Casio F-91W’yi programlanabilir bir saate dönüştürmek

  • Sensor Watch, Casio F-91W’nin mevcut quartz movement’ını değiştiren bir logic board’dur
  • F-91W, yaklaşık 90 milyon adet satıldığı bilinen klasik bir quartz saattir
  • Yeni kart mevcut parçaları aynen kullanır
    • Orijinal LCD ekran
    • Düğmeler
    • Piezo buzzer
  • Kart, ARM Cortex M0+ tabanlıdır ve programlanabilir
  • Sensor Watch projesi, kolayca değiştirilebilen saat yüzleri ve “complications” adı verilen küçük yardımcı uygulama paketleri sunar
  • Bluetooth radyosu yoktur; ancak hafif saat kasası, aylarca pil ömrü ve doğrudan yeniden build edilebilen yapısı avantaj sağlar

Bir saat içinde yapılan özellikler

  • Kart değişimi, 2FA secret ayarı ve yeni saat yüzü yazımı yaklaşık 1 saat içinde tamamlandı
  • Google ve Github hesaplarının OTP kodları bilekten görülebilecek şekilde ayarlandı
  • Kürek çekme strokmetresi veya cadence metre olarak kullanılabilecek yeni bir ratemeter saat yüzü yazıldı
  • wasm tabanlı emülatör sayesinde bilgisayarda test etmek kolay; kişisel build’ler web sayfasında doğrudan çalıştırılabiliyor

Saatin sunduğu saat yüzü akışı

  • MODE düğmesine bir kez basınca 2FA token saat yüzüne geçiliyor
  • 2FA saat yüzünde ALARM düğmesi Google ve Github token’ları arasında geçiş yapıyor
  • MODE düğmesine tekrar basınca yeni yapılan ratemeter saat yüzüne geçiliyor
  • ratemeter’da, takip edilen hedefin dakika başına hızını ölçmek için ALARM düğmesine periyodik olarak basılıyor
  • Bu build’de birkaç varsayılan saat yüzü de bulunuyor
    • Dünya saati
    • Gün doğumu/gün batımı hesaplayıcı
    • Ay evresi göstergesi
    • Saatin iç sıcaklık sensöründen gerçek zamanlı çıktı
    • 24 saat ayarı seçici
    • Saat/tarih ayarlama modu
  • Sensor Watch movement kaynak ağacında pulsometer ve orrery gibi başka saat yüzleri de var
  • F-91W modül yükseltme süreci John Graham-Cumming’in blogunda belgelenmiş

TOTP saat yüzünü ayarlama yöntemi

  • TOTP saat yüzü, benzersizlik kaynağı olarak geçerli zamanı kullanan zamana dayalı tek kullanımlık parolalar üretir
  • Google, Github gibi çeşitli web sitelerine giriş için iki aşamalı doğrulama kodu üretiminde kullanılabilir
  • ALARM düğmesiyle ayarlanmış web siteleri ve TOTP secret’ları arasında geçiş yapılır
  • Birden fazla web sitesi ve secret desteklenir; ancak QR koddan secret’ı çıkarıp saat yüzü kaynak koduna doğrudan eklemek gerekir
  • TOTP secret ekleme adımları

    • Kod üretmek istediğiniz web sitesinden TOTP secret veya QR kod alın
    • Yalnızca QR kod varsa, secret Stefan Sundin’in web sitesinden çıkarılabilir
    • Çıktı yaklaşık 32 karakter uzunluğunda alfanümerik bir dizedir ve Base32 ile kodlanmış TOTP secret’tır
    • Secret’ı saat yüzü koduna koymak için cryptii.com üzerinde Base32’yi onaltılık byte’lara dönüştürmek gerekir
    • TOTP secret büyük harflerle girilmelidir
    • Dönüştürülen onaltılık byte’ları TOTP saat yüzü kaynak koduna ekledikten sonra movement’ı yeniden derleyin
  • totp_face.c içinde değiştirilecek yerler

    • Demo anahtar kaldırılabilir; listenin sonuna yeni anahtar eklemek için num_keys değeri 1 artırılır
    • keys[] dizisinin sonuna dönüştürülen onaltılık byte’lar eklenir
      • Her byte’ın önüne 0x eklenir ve virgülle ayrılır
      • Mevcut son byte’tan sonra da virgül eklenmelidir
    • key_sizes[] dizisinin sonuna eklenen secret’ın boyutu, yani az önce koyulan hex byte sayısı eklenir
    • timesteps[] dizisinin sonuna 30 öğesi eklenir
    • labels[][2] dizisine gösterilecek etiket eklenir
      • Google hesabıysa { 'g', 'o' } gibi bir etiket kullanılabilir

ratemeter saat yüzü implementasyonu

  • ratemeter saat yüzü kodu, ana projeye gönderilen pull request içinde yer alıyor
  • Implementasyonun büyük bölümü ratemeter_face_loop adlı ana döngü fonksiyonu içinde
  • Bu fonksiyon düğme giriş olaylarını ve saat tick olaylarını işler
  • Saat yüzü, aralık ölçümü veya animasyon işleme için tick periyodu isteyebilir
  • movement, watch_display_string yardımcı fonksiyonunu sağlar
    • Casio ekranının sınırlı 7+ segment öğelerinde alfanümerik dizeleri göstermeye çalışan bir fonksiyondur
    • Rastgele dizeleri sınırlı ekrana eşleme sorunu ve istisnalar dokümanda açıklanmıştır
  • Olaylara göre davranış

    • EVENT_ACTIVATE
      • Saat yüzü etkinleştiğinde haftanın günü gösterim alanında RA gösterilir
    • EVENT_MODE_BUTTON_UP
      • MODE düğmesine basılınca sonraki saat yüzüne geçilir
    • EVENT_LIGHT_BUTTON_DOWN
      • LIGHT düğmesine basılınca LED aydınlatma açılır
    • EVENT_ALARM_BUTTON_DOWN
      • ALARM düğmesine basılınca bu giriş ile önceki giriş arasındaki aralıktan dakika başına hız hesaplanır
      • Saat yüzü durumunda saklanan tick sayacı sıfırlanır
      • RATEMETER_FACE_FREQUENCY ile hızlı tick periyodu istenir
      • Bu sabit 1/16 saniye olarak tanımlıdır
    • EVENT_TICK
      • Geçerli hız ekranda gösterilir
      • Hız 0 ise yalnızca ra gösterilir
      • 500/min’den hızlıysa ra Hi gösterilir
      • 1/min’den yavaşsa ra Lo gösterilir
      • Diğer durumlarda hesaplanan hız ra %-3d pn biçiminde gösterilir
      • Sonunda tick sayacı artırılır

Satın alma bilgisi ve bağlılık durumu

  • Sensor Watch, Oddly Specific Objects üzerinden edinilebilir
  • Oddly Specific Objects ile herhangi bir bağlılık ilişkisi yoktur

1 yorum

 
GN⁺ 2024-07-28
Hacker News yorumları
  • TOTP gizli değerini rastgele bir web sayfasına girmek rahatsız edici
    Linux’ta base32 ve od araçları zaten kurulu olabilir; Ubuntu’da coreutils paketinin içinde yer alıyor
    Bunun dışında proje harika ama saat tasarımı biraz çirkin

    • İlla bir web uygulaması kullanmanız gerekiyorsa, en azından yalnızca istemci tarafında çalışan ve güvenlik testlerinde yaygın kullanılan CyberChef’i kullanmak daha iyi
      https://gchq.github.io/CyberChef/
    • Bu yüzden uMatrix’i hâlâ hazır tutuyorum
      https://i.imgur.com/9MYqLvj.png
      Beklenmedik bir sunucu tarafı davranışı olmadığından emin olmak için XHR’ı hızlıca kapatabiliyorum
    • Bu kart A158W ve A171W ile de uyumlu; onlar çok daha güzel görünüyor
    • base-32 çözme ya da TOTP üretme gibi basit bir iş için neden üçüncü bir tarafa, üstelik bir web sitesine güveneyim ki diye düşünüyorum
  • Demoda ara sıra garip bir ⌍ simgesi görüyorsanız, bu “küçük 7”dir
    Çünkü bu saatte birinci ve üçüncü rakamların üst ve alt segmentleri, yani A ve D segmentleri birbirine bağlı
    https://joeycastillo.github.io/Sensor-Watch-Documentation/wi...
    Bu ekrana ne kadar çok verimlilik sığdırıldığını görmek gerçekten şaşırtıcı
    Normal kullanımda bu hanelerin yalnızca 0~5 göstermesi yeterli; ilk rakam saatte yalnızca 0, 1, 2’ye ihtiyaç duyuyor ama kronometre 59:59.99’a kadar çıkıyor
    Bu rakamlarda A ve D segmentlerini ayırmaya gerek yok; teoride kronometre 69:59.99’a kadar gitse de sorun olmazdı ama “bir saat” yeterli görülmüş gibi
    8 ve 9 da hem üst hem alt segmentleri yaktığı için pratikte sorunlu olan tek rakam 7

    • oddly specific objects üst seviye bir yedek LCD geliştiriyor
  • Sonunda HN’ye gelmemi sağlayan bir içerik çıktı
    F-91W muhtemelen A158W[1] ile aynı form faktörüne sahip gibi; A158W ise fiyatına göre inanılmaz derecede yakışıklı bir saat
    Her şeyle uyuyor, şık ama göze batmıyor; bu yüzden daha pahalı saatler yerine sık sık onu takıyorum
    Metal kayışın kol kıllarını çekmesinden endişeleniyorsanız, bir yılda ancak iki kez falan oldu ve diğer ucuz metal kayışlara göre çok daha az
    “Smoky” bir alternatif istiyorsanız A168WGG[2]’de kayışta gunmetal gri tonu var, kadran siyaha yakın işlenmiş ve illuminator yalnızca yazıları aydınlatıyor
    Ancak A168, A158’den çok az daha büyük; iç modülün aynı şekilde oturup oturmadığını bilmiyorum ama daha büyükse daha fazla alan da vardır, muhtemelen olur
    Saatlerden devam edecek olursam, iş için siyah kayışlı saat olarak GA-B2100-1AJF[3] kullanıyorum
    Bir G-Shock’a göre oldukça şık ve akıllı saat olmamasına rağmen birçok özelliği var
    Bluetooth’lu model, daha ucuz modellere göre kadran rengi ve ton kontrastı açısından daha iyi; bu yüzden kıyafetle eşleştirmesi daha kolay
    [1] https://www.amazon.com/Casio-A158WA-1-Water-Resistant-Digita... [2] https://www.amazon.com/dp/B08195YQLQ/ [3] https://www.amazon.com/dp/B09YG8F41Y/

    • Ne yazık ki uyumlu değil
      Sensor Watch kartı, orijinal Casio 593 modülünden alınan parçalara ihtiyaç duyuyor
      Uyumlu saatlerin listesini burada görebilirsiniz
      https://www.sensorwatch.net/docs/
      Aynı 3 düğmeli yerleşime sahip olsa da farklı mekanizma kullandığı için çalışmayan saatler: A168W, A700W, LA680W, B650W
      Genel olarak, 3 düğmeli dijital Casio olup yan aydınlatma yerine düzgün bir “illuminator” arka ışığı varsa 593 değildir, dolayısıyla çalışmaz
  • Bu projeyi gerçekten seviyorum ve kelimenin tam anlamıyla her gün kullanıyorum
    Kısa süre önce kaynak kod içinde TOTP kodlarını tanımlamak için yeni bir arayüz uyguladım; bu yüzden bu yazıdaki açıklama artık doğru değil
    Şu anda şöyle çalışıyor
    static totp_t credentials[] = {
    CREDENTIAL(2F, "JBSWY3DPEHPK3PXP", SHA1, 30),
    CREDENTIAL(AC, "JBSWY3DPEHPK3PXP", SHA1, 30),
    };
    https://github.com/joeycastillo/Sensor-Watch/blob/main/movem...
    Nabız ölçeri astım solunum hızı ölçeri olarak da kullanabilmek için kullanıcı kalibrasyonu ekledim ve şimdiden hayat kurtarmaya yardımcı oldu
    Kalibrasyon ve sıcaklık telafisi de var; saatin doğruluğunu yılda yaklaşık 10 saniye seviyesine çıkarıyor
    Topluluk da büyüyor ve birçok kişi firmware’i kurcalamak için katıldı
    Yakın zamanda biri bu saat için sonsuz koşu oyunu yaptı
    https://github.com/joeycastillo/Sensor-Watch/pull/419
    Bakımcılar da gerçekten iyi insanlar
    Zaman ayırmaya değecek harika bir açık kaynak proje arıyorsanız, tam olarak bu

    • Standart bir saat piliyle çalışacak gibi duruyor; pil ömrünün ne kadar olduğunu merak ediyorum
      Belgelerde bulamadım
  • TOTP kullanmak için kol saatinizi yeniden derleyip yeniden flash etmeniz gerekiyorsa, kullanım alanı epey sınırlı olur gibi

  • Harika
    Casio hesap makineli saat için de birinin böyle bir şey yapmasını hep istemişimdir

  • SecurID token’larda da bunun çalışması güzel olurdu

  • Gerçekten ilginç
    Nixon’da çalışıyorum; böyle bir şeyi Nixon dijital saatlerinde de denemek isterim ve yazar benzer bir yazı yazmak isterse birkaç ücretsiz saat ayarlayabilirim gibi geliyor

  • Neden bunu en akıllı akıllı saatimde kullanamıyorum ki
    Eski Casio’ya dönmek istiyorum

  • Bu gerçekten iyi; ben de aptal akıllı saatle benzer bir şey yapmayı düşünmüştüm ama operasyonel güvenlik açısından TOTP’nin bu kadar görünür ve kolay erişilebilir olmasının uygun olup olmadığını merak ediyorum
    Saat kaybolursa ya da çalınırsa ne olur?

    • Sahibi “bu benim ikinci kimlik doğrulama faktörüm” diye ortalıkta söylemedikçe, yoldan geçen biri bunu sadece bozuk bir saat sanır
    • Pebble’a TOTP kodları koyup kullanıyorum ve bence sorun yok
      Hangi servis olduğu hemen anlaşılmasın diye etiketliyorum
      Pebble’da fiilen bir kilit ya da güvenlik yok ama sonuçta bu sadece ikinci kimlik doğrulama faktörü
      Rastgele üretilmiş parolayı zaten biliyor, bileğimde TOTP olabileceği bilgisini araştırmış ve gerçekten saatimi çalabiliyorsanız zaten kaybetmişimdir; bence bu kadarı rahatlıkla takas edilebilir
    • Yine de YubiKey’den daha az dikkat çekici değil mi?