Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - hazardrok

Stran: 1 2 3 [4] 5 6
46
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 15:21:07 »
No žádná autentizace tam teď v podstatě není, ale možná si jen nerozumíme :-) Server si vyžádá data o zařízení a to mu je pošle jako acsii znaky. Server nemá možnost zjistit jestli klient kecá (jen poznámka: data jsou jen chráněna pomocí CRC to je jediná ochrana). Současně zařízení bude komunikovat s jakýmkoliv serverem, který zná protokol a umí vypočítat CRC.

Můj návrh s autentizací pomocí AES jen tento (má za cíl autorizovat mezi sebou obě strany jen při navazování spojení)...a nemění komunikační protokol
1. jen obě strany už od začátku znají šifrovací klíč
2. server vygeneruje náhodný vektor, který použije k inicializaci šifry a zašifruje nějaký text (třeba náhodný nebo "5*9=")
3. Do zařízení odešle jak vektor tak i šifru
4. Zařízení rozšifruje zprávu a vygeneruje nový náhodný vektor pomocí něj zašifruje výsledek 45. To odešle zpět serveru.

Tím se zajistí, že klient i server si musí rozumět a můžou spolu komunikovat.

47
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 14:51:42 »
Protokol je jasně daný
No a kde teda je popsaný?

Přesný popis není důležitý, protože ten útočník rozklíčuje kompletně jen velice težce. Zkusím večer vygenerovat zničující zprávu a ta se pro celý proces může použít, protože bezpečně to zbortí.

48
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 14:46:32 »
Citace
A ten Tiny AES běží přímo na tom zařízení? Pokud to zvládne ještě SHA-2, tak se tam dá udělat AES + HMAC a to bude podstatně lepší. Ale musí to dělat někdo ví co dělá, ne někdo kdo neví jak se dělá MITM. Jinak tohle se normálně řeší tak, že nakoupíš nějaké malé routříky na kterých běží OpenWRT, nastavíš na tom OpenVPN (nebo jinou VPN, wireguard, ...) a dáš to před to zařízení. Samozřejmě ne vždy to jde provést (cena, prostor, spotřeba). Jako bonus získáš přístup na to zařízení i když je za NATem atd.

Na tom zařízení běží pouze komunikační protokol hodně příbuzný protokolu IRlan nebo možná MODBUS. Používá se na některé průmyslové systémy už desítky let. Ten není možné změnit, ale můžu do něj něco přidat. A také není možné přidávat moc, protože tam je jen STM32F100 a to dělá mnohem důležitější věci než jen komunikaci a počítání klíčů.

To s tím malým routerem s OpenWRT je krásná myšlenka. Škoda, že to někoho nenapadlo už před lety...

49
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 14:37:21 »
protokol zdokumentovany byt nemusi, pokud mam k dispozici klienta i server, abych si mohl cist sitovou komunikaci, tak to je lehke.
„Lehké“ je relativní, samozřejmě je možné že ten protokol bude jednoduchý a udělat to bude na pět minut, ale taky tam může být něco nezjevného a reverzování bude chvíli trvat. A protože cílem je hodnotit bezpečnost protokolu, tak je blbost pálit čas na implementaci a řešení toho proč to nefunguje. Navíc s tímhle rozpočtem, a když to vynásobíš odhadem že se to celé podaří (jak technicky, tak že uživatel hazardrok nezdrhne bez zaplacení, případně si nevymyslí ze své neznalosti nějaký pseudodůvod proč se tvůj útok nepočítá, a taky že tě tu někdo nepředběhne - jak vidíme tak už jsme dva co to jako chtějí implementovat) tak 50% tak to celé musíš stihnout za několik málo hodin aby to bylo rentabilní. Jinak z toho co popsal mi přijde že to bude deset řádků Pythonu (necháš projít ten úvodní handshake a pak už si komunikaci upravuješ jak je libo) a tak bych do toho šel :), ale necháme se překvapit.

Protokol je jasně daný a jediné co bude případnému útočníkovy stačit, když mu dám pevně danou sekvenci bajtů, kterou tam pošle a má vyhráno. Nic víc nic míň. Klidně poskytnu HW, který třeba začne hrát mozartovu operu, když se to podaří do zařízení zapsat. Předvedu, že já jsem schopen to udělat, aby jste si nemysleli, že to je podvod. Peníze dám klidně do úschovy někomu zde spolehlivému, kdo je buď předá tomu kdo to dokáže nebo je vrátí.

50
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 14:27:25 »
Citace
Z tohoto mi přijde, že se snažíš implementovat si protokol pro šifrování a autentizaci „na koleně“, což vzhledem k tomu, jak se ptáš na základy typu únos TCP spojení a MITM, nedopadne dobře. Kdybys použil nějaký normální standardní protokol (třeba TLS) nebo o tom něco věděl (no offense), tak bys to samozřejmě udělal tak, že je šifrovaná a podepisovaná celá komunikace. I ten AES a spol. k tomu lze samozřejmě použít - buď si vybereš mód, který je autentizovaný by default (AEAD, například GCM), nebo do komunikace vkládáš HMAC podpisy zašifrovaných bloků. Dále se bojím, že to naprogramuješ tak, že bude možný replay útok, nebo tam nasekáš chyby typu neautentizovaný CBC nebo counter mód, takže útočník bude moct přehazovat jednotlivé bity ve zprávě, transplantovat bloky atd.

No úplně na koleně to být nemělo. Chtěl jsem použít https://github.com/kokke/tiny-AES-c a ten algoritmus CTR s AES-256. Můj návrh byl ten, že bude pevně daný klíč, který budou znát jen client a server. Pro každé zašifrování se vygeneruje inicializační vektor a ten se pošle spolu s daty (nešifrovaně). Pokud to správně chápu a bude pro každou šifru jiný vektor, který bude generován s co největší náhodností je to neprůstřelné. Současně toto by mělo být jen kvůli ověření pravosti serveru resp. clienta při navazování spojení. Chci si s tou myšlenkou ještě po večerech hrát, protože se mi to docela líbí. Nebo jí zavrhnu, protože najdu slabinu.

Je to celé naprd, protože znám systém za statisíce a stovky zařízení, které jsou takto blbě navržena a už roky běží (né mojí vinou). Změnit šifrování na TLS není už realizovatelné. A v minulosti s tím pracovalo desítky IT odborníků a ani jeden jediný nikdy funkci neoponoval ani neupozornil na možná rizika...zde je vidět jak naši IT odborníci pracujou a za co berou platy (nechci se nikoho dotknout, to je bohužel tvrdá realita). Také to nelze jednoduše stopnou a říci uděláme to jinak.



51
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 13:37:01 »
Díky uživateli Filip Jirsák za komentář. Tomuto asi rozumím, ale jaká je reálná šance, že to někdo dokáže? Myslím tím, jestli toto dokáže 9 z deseti hackerů, který se o to pokusí, protože to je tak strašně jednoduché nebo to dokáže 1 z tisíce, protože má zrovna přístup k nějaké páteřní síti a ví co má hledat. Já mám např. přístup jak ke klientovy tak k serveru a vím jak celej princip pracuje. Znamená to tedy, že mi stačí jen udělat kroky 1..2...3, zmačknout enter a data, která systém poškodí jsou odeslaná?

52
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 13:29:26 »
Dam komukoliv 5000Kč když to dokáže nabourat...má někdo zájem?

napis verejnou ip, kde ti jede server :-)

No pokud bys o to měl skutečně zájem, o víkendu si nějakej pronajmu a rozjedu na něm ten systém. A myslím to naprosto seriózně, protože mě opravdu zajímá jestli to lze takto jednoduše. Jsem přesvědčen, že to nedokážeš. Máš nějakej tip na poskytovatele nějakých virtuálních serverů, který by byl vhodný?

53
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 12:23:42 »
Dam komukoliv 5000Kč když to dokáže nabourat...má někdo zájem?

54
Vývoj / Re:TCP bezpečnost
« kdy: 04. 02. 2021, 11:40:13 »
Autorizaci klienta chci teď po novu řešit pomocí AES a předpokládám, že SERVER i CLIENT při navazování spojení pozná zda je to fejk nebo ne. Pro mě je největší otázkou co se bude po tom co je spojení navázané. Klidně ať ten operátor data vidí to je mi úplně jedno (jedná se o data z měření, žádné tajnosti). Ten systém ale umožňuje data i přijímat např. konfiguraci. Tu bych docela nerad aby mi někdo měnil. Kdybych komunikaci zašifroval, bylo by všechno v cajku, ale je to vůbec nutné? Snad chápete co tím chci říci...

55
Vývoj / TCP bezpečnost
« kdy: 04. 02. 2021, 11:10:09 »
Ahoj, v poslední době mi příjde, že by se pomalu každý kdo používá přenos dat na internetu měl bát o jejich bezpečnost. Proto bych se chtěl jen teoreticky zeptat, jak by se dala hacknout tato situace...

Mám TCP klienta, který se připojuje na TCP server s veřejnou IP adresou. Jakmile se naváže spojení, tak veškerou komunikaci přebírá TCP server. Tj. server vždy zahajuje komunikaci a client mu odpovídá. Komunikace je nezabezpečená.

Moc nerozumim tomu, jak by někdo třetí, který sedí někde buhví kde mohl zasáhnout do této komunikace.
Jediné co mě napadá je že existuje hackerský TCP server, který má stejnou IP adresu jako můj a tak se client připojí k němu. Jak by to ale mohl dokázat, když jsou všichni z jiného města? V rámci jedné budovy client-hacker možná, ale jiná síť...

Existuje nějaká metoda jak se do toho spojení dostat, nebo možná ještě jinak jak bych to mohl sám dokázat? Abych to zjednodušil tak je mi úplně jedno, jestli ten hacker data sleduje. Jediné co nechci je, aby do toho spojení mohl data poslat.


56
Vývoj / Re:Práce s vlákny v C
« kdy: 19. 01. 2021, 18:44:14 »
no super...snad se konecne pohnu kupredu (rad bych pouzil spravnym smerem, ale do toho je jeste daleko :))
Pridal jsem do kodu mutex a zkusil jak se to bude chovat. Po spusteni pres:
Kód: [Vybrat]
valgrind --tool=helgrind ./main
jsem dostal po skonceni programu tuto hlasku
Kód: [Vybrat]
==3853== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 50221857 from 38)

Vyslednu kod je zde:
Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <pthread.h>

static int init_function(void);
static void *handle_function(void *arg);

static uint8_t thread_var = 0x00;
static pthread_t thread;
static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

int main(int argc, char *argv[]){
  int ret;
  int c_run = 100;
   
  while(1){
    ret = init_function();
    if(ret == 1){
      //printf("vytvoreno nove vlakno\n");
      if(c_run != 0){ c_run--;}
      else{ break;}
      }
    }
 
  return 0;
  }

static int init_function(void){
  uint8_t var;
 
  pthread_mutex_lock(&mymutex); 
  var = thread_var;   
  if(var == 0x00){ thread_var = 0xFF;}
  pthread_mutex_unlock(&mymutex);

  if(var == 0xFF){     
    return -2;
    }   
   
  if(pthread_create(&thread, NULL, handle_function, NULL)){
    //vlakno nebylo vytvoreno, musim shodit thread_var 
    pthread_mutex_lock(&mymutex);       
    thread_var = 0x00;
    pthread_mutex_unlock(&mymutex); 
     
    return -1;
    }
 
  pthread_detach(thread);
  return 1;
  }

static void *handle_function(void *arg){   
  sleep(1);
 
  pthread_mutex_lock(&mymutex);
  thread_var = 0x00;
  pthread_mutex_unlock(&mymutex);
 
  return NULL;
  }

Ze zacatku mi to nefungovalo. Po chvili mi doslo, ze problem bude asi v puvodnim volani funkce printf na konci vlakna. Kdyz jsem ji odstranil uz to zadne chyby nehlasilo. Uz mi jsou ty dotazy skoro trapny, ale je toto jiz korektni?

57
Vývoj / Re:Práce s vlákny v C
« kdy: 19. 01. 2021, 15:37:34 »
Jsem presvedecn, ze dotaz znel v podstate jasne...Ptal jsem se na to jestli ten muj prilozenej kod bude fungovat korektne. A cekal jsem ze dostanu odpoved. Take jsem presvedecn, ze jsem jednoznacnou odpoved nedostal, ale urcite ted vim neco vice o konfiguraci SQLite. Rada, ze existuje jiny zpusob napr. libuv neni odpoved na moji otazku. Tim se samozrejme nechci nikoho kdo prispival dotknout, na druhou stranu by me zajimalo kam uzivatel anonacct miri?

58
Vývoj / Re:Práce s vlákny v C
« kdy: 19. 01. 2021, 09:35:11 »
Diky za pripominky. Pokusim se to shnout...
1. muj jednoduchy priklad nebyl vylozene vyvracen ani pohanen a lze ho pouzit
2. pokud budou pouzity nejake knihovny, musi byt bud "thread safety" nebo je potreba pouzit nejakou pokrocilejsi techniku spravy vlaken aby se nestalo to, ze vlakna budou prustupovat k jednomu zdroji, ktery si budou navzajem menit napr. vyrovnavaci bufer nebo nejaky statusovy priznak. Zde zminim napr. mutex.
3. pri hledani problemu muze pomoci najeky ladici nastroj napr. valgrind apod.

Overil jsem si, ze knihovna pro SQlite je "thread safety", protoze kod:
Kód: [Vybrat]
ret = sqlite3_config(SQLITE_CONFIG_SERIALIZED);

vraci:
Kód: [Vybrat]
SQLITE_OK

coz podle dokumentace znamena, ze je mozne pouzit tento mod pracujici s vice vlakny. Tato knihovna se tedy zda byt OK.

U json-c si nejsem vubec jistej, protoze mi asi chybi zkusenosti s pochopenim principu. Tam je ale situace trochu jina, protoze json se pouziva pouze jednou pri uplne prvnim pripojeni klienta o krerem system nema zadne informace. Jakmile si informace vytvori, uz se pro tohoto clienta nikdy nepouzije. Volani funkci teto knihovny tedy neni potreba do jineho vlakna davat.

Zaverem mi tedy vyplyva, ze je pokud se mi to povede odladit a bude to fungovat, tak bych na vetsi problemy (nez uz ted mam) nemel narazit.

59
Vývoj / Re:prace s vlakny v C
« kdy: 18. 01. 2021, 19:49:20 »
O tom zamykani jsem uz neco malo cetl, ale podle me v tomto pripade neni nutne. System je postaven tak, ze kazdy client je jednoznacne pojmenovany a ma ke svemu jmenu prirazenou jednoznacnou databazi. Nemuze do ni tedy vstoput nikdo jiny, protoze system neumoznuje dva stejne pojmenovane clienty zaroven. Zatim to tedy asi pouziju tak, jak jsem si usmyslel dokud se mi to nekde nezhrouti. Mozna misto
Kód: [Vybrat]
static pthread_t thread_var
pouziju neco jako
Kód: [Vybrat]
atomic_long thread_var
Pokud spravne chapu princip atomickych promenych, tak by ten program mohl maximalne nefungovat.

60
Vývoj / Práce s vlákny v C
« kdy: 18. 01. 2021, 18:33:07 »
Ahoj, chtel bych se trochu seznamit s programovanim vicevlaknovych programu v C na linuxu. Mam totiz napsany vlastni jednovlaknovy server a domnivam se, ze pokud mi client zacne delat nejakou slozitou operaci napr. pracovat s databazi (pouzivam SQLite v kombinaci s json-c), tak mi to blokuje dalsi klienty. Abych do stavajiciho jiz odladeneho programu co nejmene zasahoval, vymyslel jsem si tento postup...pokud bude chtit client pristupovat do databaze, tak se tento pozadavek otevre v novem vlakne a jakakoliv dalsi operace totoho clienta bude blokovana dokud vlakno neskonci.

Zjednodusene jsem se to pokusil napsat do kodu, tak jak bych to chtel realizovat a ten zde predkladam. Muj dotaz tedy zni, jestli takto napsany kod bude korektne fungovat a pokud ne, tak jak by to melo vypadat? Ani me nezajima jestli je to takto vhodne resit apod., jde mi jen o princip. Dik za radu.

Kód: [Vybrat]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

static int init_function(void *arg);
static void *handle_function(void *arg);

static pthread_t thread_var = -1;

int main(int argc, char *argv[]){
  int ret; 
   
  //printf("%ld, %ld\n", thread_var, (long)&thread_var); 
   
  while(1){
    ret = init_function((void *)&thread_var);
    if(ret == 1){
      printf("vytvoreno nove vlakno\n");
      }
    //else if(ret == -1){
    //  printf("vlakno se nepovedlo vytvorit\n");
    //  }
    //else if(ret == -2){
    //  printf("vlakno stale bezi\n");
    //  }
   
    //printf("%ld, %ld\n", thread_var, (long)&thread_var); 
    }
 
  return 0;
  }

static int init_function(void *arg){
  pthread_t *p_thread = (pthread_t*)arg;

  if(*p_thread != -1){
    return -2; 
    } 
   
  if(pthread_create(&thread_var, NULL, handle_function, arg)){
    return -1;
    }
 
  //printf("%ld, %ld\n", thread_var, (long)&thread_var);
 
  pthread_detach(thread_var); 
  return 1;
  }

static void *handle_function(void *arg){ 
  pthread_t *p_thread = (pthread_t*)arg; 
 
  //printf("%ld, %ld\n", *p_thread, (long)p_thread);
  sleep(5);
  printf("konec vlakna\n");
 
  *p_thread = -1;
 
  return NULL; 
  }

Stran: 1 2 3 [4] 5 6