2010-04-08 14 views
6

Jestem bardzo zaskoczony, że problem nie został szczegółowo omówiony:Czy istnieją bardziej bezpieczne alternatywy dla klasy .Net SQLConnection?

mówi nam, jak użyć windbg do zrzutu działających ciągów procesów .Net w pamięci.

Spędziłem dużo czasu na badaniu klasy SecureString, która wykorzystuje niezarządzane bloki z przypiętymi blokami i utrzymuje również zaszyfrowane dane. Świetna sprawa.

Problem pojawia się, gdy używasz jego wartości i przypisujesz ją do właściwości SQLConnection.ConnectionString, która jest typu System.String. Co to znaczy? Cóż ...

  • To przechowywane w postaci zwykłego tekstu
  • Garbage Collection porusza się wokół, pozostawiając kopie w pamięci
  • To można odczytać z pamięci WinDBG wysypisk

That całkowite neguje funkcja SecureString!

Co więcej, klasa SQLConnection jest nieodłączna, nie mogę nawet przetworzyć własnej z właściwością SecureString; Yay dla zamkniętego źródła. Yay.

Nowa warstwa DAL jest w toku, ale dla nowej wersji głównej i dla tak wielu użytkowników minie co najmniej 2 lata, zanim każdy użytkownik zostanie uaktualniony, inni mogą pozostać na starej wersji bezterminowo, z dowolnego powodu.

Ze względu na częstotliwość połączenia, układanie z SecureString nie pomoże, ponieważ niezmienne stare kopie przechowują się w pamięci do momentu pojawienia się GC. Zintegrowane zabezpieczenia systemu Windows nie są opcją, ponieważ niektórzy klienci nie działają w domenach, a inne przechodzą i łączą się przez sieć.

Jak zabezpieczyć ciąg połączenia w pamięci, aby nie można było go wyświetlić za pomocą windbg?

+0

Czy mówisz o aplikacji znajdującej się na komputerze klienta lub aplikacji internetowej? – ALOToverflow

+0

To jest aplikacja kliencka po stronie klienta .Net 2.0, architektura klient-serwer – invert

Odpowiedz

10

Jeśli kontrolujesz maszynę w takim stopniu, że możesz odczytać pamięć innego procesu, możesz również zastąpić odwołanie do klasy SecureString odwołaniem do string. Będziesz mieć dostęp do kluczy prywatnych, z których może korzystać inny proces.

Nie ma obrony przed hakerem, który jest właścicielem pamięci procesu. :)

+0

Na pewno, dobry punkt! Celem, do którego dążę, jest zmniejszenie powierzchni ataku. To jest interesujące ćwiczenie przynajmniej w zakresie bezpieczeństwa :) – invert

4

Nie prawdziwa odpowiedź na pytanie jednak:

próbować używać uwierzytelniania systemu Windows zamiast uwierzytelniania SQL. Nawet jeśli uda ci się zabezpieczyć hasło w pamięci programu użytkownik może je zobaczyć za pomocą sniffera ruchu.

Kolejną zaletą uwierzytelniania systemu Windows jest to, że serwer sql nie musi przechowywać skrótów haseł użytkowników. Z ustalonym uwierzytelnieniem sql hacker może bruteforce hasło z hash lub zastąpić go innym. W rzeczywistości hasło można bardzo łatwo zastąpić przy użyciu niektórych programów.

+0

Ja też wolałbym tę metodę, ale nie jest to opcja dla jednej trzeciej użytkowników, ponieważ czasami wędrują i łączą się zdalnie przez Internet. – invert

+0

Proszę wyjaśnić: Czy mówisz, że twoja instancja SQL Server jest otwarta na świat (publiczny adres IP i otwarty port)? Z Twojego opisu wynika, że ​​masz zainstalowaną na komputerze klienckim aplikację kliencką, która wykonuje połączenie SQL przez Internet, bez VPN, z otwartym serwerem SQL. Jeśli tak, to masz znacznie większy problem z bezpieczeństwem niż skomplikowana próba odczytania pamięci procesu na kliencie w nadziei na uzyskanie hasła. – David

+0

Prawidłowe, aczkolwiek z niestandardowym portem, nie standardowy port SQL. Jakieś konkretne obawy/linki, o których myślisz, dotyczące tego ryzyka? Chciałbym podejść do kierownictwa w tej sprawie ... – invert

2

Komunikacja między procesem a serwerem sql idealnie dzieje się na szkielecie i jeśli to jest zagrożone, to jest to najmniej zmartwień.

+0

Powodem, dla którego koncentruję się na stronie klienta, a nie na transporcie, jest ubiegły tydzień, w którym złożyliśmy wniosek o naruszenie praw autorskich, ponieważ klient zdecydował się sklonować nasz system, mamy zrzuty ekranu , to dość zabawne. Właśnie to sprawiło, że bardziej zagłębiłem się w bezpieczeństwo. – invert

1

Ponieważ jest to aplikacja po stronie klienta, jeśli zastanawiasz się, że poświadczenia ciąg połączenia mogą być narażone na niektóre hakerów, jest to wada projektu ...

Jeśli łączysz się z serwerem sql z danymi uwierzytelniającymi administratora, to jest twój problem. Powinieneś utworzyć użytkownika z ograniczeniami i użyć go w swojej aplikacji.

Jeśli boisz się ujawnić swoją bazę danych, możesz uzyskać dostęp do usługi internetowej z aplikacji. Ta usługa sieciowa będzie wtedy uzyskiwać dostęp do bazy danych i zwracać wyniki.

+0

Poświadczenia SQL są ograniczone, ale ze względu na wielkość systemu, jak powiedziałem w OP, usługa DAL jest przeznaczona do wydania głównego. Szukam alternatywy, która pasowałaby do obecnej konfiguracji. Wada konstrukcyjna tak, zdecydowanie! – invert

+0

Nie możesz dodać użytkownika z ograniczonymi danymi uwierzytelniającymi? Czy możesz przekierować połączenie do bazy danych do aplikacji/usługi internetowej znajdującej się na twoich serwerach? Często, gdy mówimy o wadach projektowych w zakresie bezpieczeństwa, możliwe i _efektywne_ poprawki są ** naprawdę ** ograniczone. – ALOToverflow

+0

Po prostu zwracam uwagę, że "hakerzy" oznaczają zarządzanie klientami i programistów, którzy próbują inżynierii wstecznej naszego systemu. – invert

Powiązane problemy