BOINC@Poland

Inne => Archiwum => Wątek zaczęty przez: Rysiu w 07 Czerwiec 2014, 18:36

Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: Rysiu w 07 Czerwiec 2014, 18:36
Piszę aplikację na socketach w C.

Czy jako klient mogę się jakoś podszyć i zmienić swoje IP tak ze serwer wykryje (i w zapisywanych logach) będzie miał inne IP niż to faktyczne?

Chodzi mi o to czy to wystarczające zabezpieczenie sprawdzać czy ktoś łączy się z odpowiedniego adresu IP i wtedy autoryzować takie połączenie, czy jednak istnieje możliwość aby to obejść.
Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: Dario666 w 11 Czerwiec 2014, 21:14
Jedyne co na szybko mi przychodzi do głowy to atak zwany Man in the middle.
Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: apohawk w 13 Czerwiec 2014, 15:40
Pytanie, co jest między aplikacją a klientem. Najprostsza zmiana IP to NAT i jest powszechnie stosowana np. na routerach udostępniających internet komputerom w sieci lokalnej. Można też zrobić spoofing, puścić własny pakiet, w którym wpiszemy jakieś dziwne IP. Często routery wycinają pakiety, które nadchodzą z niewłaściwej strony, czyli pakiet z IP źródłowym A pojawia się na interfejsie sieciowym, który nie jest interfejsem do wysyłania pakietów do adresu A.

[EDIT]
Może inaczej, co próbujesz zrobić?
Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: Rysiu w 15 Czerwiec 2014, 22:19
Piszę kawałek serwera odpowiedzialnego za przyznawanie kredytów pomiędzy wieloma projektami BOINC (ujednolicony system przyznawania i emisji kredytów).

Część kliencka ma być wbudowana w validatora, który to będzie wysyłał odpowiednie zapytanie do owego serwera ile ma kredytów za określone zadanie o określonym czasie wykonywania przydzielić. W owym zapytaniu zawarte są wszystkie informacje niezbędne do obliczenia przyznanych ilości kredytów.

W informacji zwrotnej validator otrzymuje ilość kredytów jaką ma przydzielić userowi.

Aktualne zabezpieczenie polega jedynie na tym, że sprawdzam czy klient (validator) łączy się z odpowiedniego przypisanego do danego projektu adresu IP (jest on zapisany w odpowiedniej kolumnie i odpowiednim rekordzie w bazie danych).

Idealnie byłoby gdyby w bazie danych obok tego adresu IP znalazło się także hasło (inne dla każdego projektu) i wykorzystywane byłoby ono do szyfrowania/deszyfrowania przesyłanych wiadomości.

Kiedyś na potrzeby studiów i artykułu naukowego zaimplementowałem 3DES'a i myślałem, że tutaj jego wykorzystam ale okazało się, że wywala mi błąd pamięci (wcześniej - kilka lat temu - działał dobrze). Nie mam energii aby dochodzić co w nim nie gra.

Stąd też moje pytanie o bezpieczeństwo. Jako tako nie przesyłam tam, żadnych danych tajnych i szyfrowanie nie jest potrzebne. Potrzebna jednak jest jakaś autoryzacja klienta, aby nie mógł podłączyć się ktoś inny i narobić bajzlu. Teoretycznie to nic by nie szkodziło aby ktoś inny się podłączył. Bo co uzyska? Nic.

Problem jednak polega na tym, że serwer emisji kredytów na podstawie zapytań pochodzących z projektów BOINC buduje własną bazę danych kredytów użytkowników. Ta baza danych powinna być (co oczywiste) odbiciem lustrzanym oryginalnej, projektowej bazy danych (zawiera jednak tylko wycinek danych z ID userów i przypisanych do nich kredytami). W przypadku padu serwera projektu (np. pad dysku) zawsze można wydobyć ilość kredytów jaką posiada dany user bez jakiejkolwiek ewentualnej straty (bo przecież ta baza danych jest budowana w czasie rzeczywistym). W przypadku zwykłych backupów zawsze możemy stracić kredyty przydzielone zaraz po zrobieniu backupu.

Już jednak admin "z palca, ręcznie" nie wpisze kredytów danemu userowi (powstanie brak spójności baz, który może być w każdej chwili wykryty). Za bardzo także nie będzie miał możliwości modyfikacji validatora, bo ten będzie udostępniany jako już skompilowany (ewentualnie kompilowany z modyfikacjami na "zamówienie" i na życzenie admina projektu). Można odzyskać dane kodu źródłowego ze skompilowanego programu ale to już nie będzie takie proste.

Sprawa jest nieco skomplikowana - niemniej pierwszą wersję serwera już zaimplementowałem. Nie działa ona efektywnie przynajmniej z kilku powodów ale jakoś działa  %)

Gdyby ktoś był chętny do pomocy to proszę pisać.
Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: krzyszp w 15 Czerwiec 2014, 23:30
Albo ja czegoś nie rozumiem, albo nieźle zamotałeś.
To ma chodzić jako projekt BOINC? Jaki "klient" na odpytywać projekt? Poco w ogóle, skoro można sparsować statsy z danego serwera?
Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: Rysiu w 16 Czerwiec 2014, 00:22
Cytat: krzyszp w 15 Czerwiec 2014, 23:30
Albo ja czegoś nie rozumiem, albo nieźle zamotałeś.
To ma chodzić jako projekt BOINC?
Gdzie tam, jako jaki projekt BOINC znowu. Toć to nie miałoby sensu jako projekt BOINC.

Cytat: krzyszp w 15 Czerwiec 2014, 23:30
Poco w ogóle, skoro można sparsować statsy z danego serwera?
Tak tylko, że żadne statystyki zapisywane do plików nie są generowane w czasie rzeczywistym. Co jeżeli nie możemy sobie pozwolić na utratę nawet jednego kredytu?

Do tego dochodzi problem zaufania do admina (który może teraz z kredytami wszystko).
Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: krzyszp w 16 Czerwiec 2014, 01:37
Wiesz, może kilku adminów da Ci wejście w system kredytowy, ale żeby wszyscy? Nie ma szans...
Tytuł: [Programowanie C] Sockety i wiarygodność adresu IP klienta
Wiadomość wysłana przez: apohawk w 16 Czerwiec 2014, 13:21
1. Tzw. "problem zaufania do admina" będzie zawsze. W pewnym momencie musisz po prostu ludziom zaufać. Jakikolwiek system kontroli adminów napiszesz, będziesz musiał zaufać adminom systemu kontroli.
2. Zamiast bawić się z autoryzacją po IP i zabezpieczaniem tego, to załóż im normalne konta albo podpisy/szyfrowanie PGP/GnuPG komunikatów przesyłanych do ciebie i tyle.