Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Filtrowanie syscalli w forkowanym programie  (Przeczytany 5966 razy)

SubArrin

  • Gość
Filtrowanie syscalli w forkowanym programie
« dnia: 2009-08-30, 14:23:45 »
Witam!
Mam następujący problem:
napisałem program, który w pewnym miejscu wygląda następująco:
x = fork();
if(x > 0){
    ...
    execv(inny_moj_program);
}
else{
    wait4(x, ...);
...
}

i teraz chciałbym sprawdzać jakie syscalle wywołuje inny_moj_program i ew. go killować, np. inny_moj_program to fork() bomba, ale ja widzę, że próbuje wywołać syscall fork i wtedy go killuje.
Nie mam pojęcia, jak się za to zabrać ;/

arctgx

  • Gość
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #1 dnia: 2009-08-30, 17:10:07 »
Cytat: SubArrin
i teraz chciałbym sprawdzać jakie syscalle wywołuje inny_moj_program i ew. go killować, np. inny_moj_program to fork() bomba, ale ja widzę, że próbuje wywołać syscall fork i wtedy go killuje.
Mógłbyś sformułować to bardziej po polsku? Jestem analfabetą względem tego języka-słowotoku (nie jedynym chyba) ;) Jeśli masz za sobą formułowanie choćby prostych instrukcji w języku programowania, to i w ludzkim języku mógłbyś lekko potrudzić się nad podziałem na odrębne kawałki, z których można złożyć sensowną całość. Nie trzeba będzie wtedy odpowiadać Ci na podstawie domysłów, że koniec zdania miał być tu a nie tam i chodziło Ci o jedno, a nie drugie.

Nie potrafię domyślić się czy szukasz kodu w C szukającego takiego wywołania w innym procesie, czy może polecenia odwalającego taką robotę (a zdaje się że strace to wyłapie). Na pierwszą wersję sam nie znam odpowiedzi (chyba że podejrzeć źródła strace), ale może jednoznaczny opis problemu zachęci kogoś innego do odpowiedzi.

SubArrin

  • Gość
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #2 dnia: 2009-08-30, 18:05:34 »
Spróbuje ;)
Po wywołaniu fork() działają dwa programy: główny i inny_mój_program.
Program główny funkcją wait4 czeka na zakończenie działania "innego".
Chciałbym zamienić to wait4 na śledzenie syscalli i ew. killowania "innego" przy znalezieniu niebezpiecznych syscalli.

Albo ogólniej: Chcę zabić inny_mój_program gdy ten będzie prónował wykonać niebezpieczne syscalle.

arctgx

  • Gość
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #3 dnia: 2009-08-30, 18:18:17 »
Jest jeszcze jeden sposób: znając sens kodu mógłbym nie potrzebować rozszyfrowania "ludzkiej" części formuły problemu ;) Teraz jaśniej to brzmi.

Nie mając nigdy do czynienia z programowaniem uniksowych aplikacji w C (bawiłem się tylko podstawami tego języka) spróbuję strzelić na podstawie manuala strace. Jego sekcja "see also" daje namiar na funkcję ptrace. Czyżby nie było to potrzebną Ci rzeczą?

Cytat: man 2 ptrace
DESCRIPTION
       The  ptrace() system call provides a means by which a parent process may observe and control the execution of another process, and examine and change its core image and registers.  It is primarily used to implement breakpoint debugging and system call tracing.

SubArrin

  • Gość
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #4 dnia: 2009-08-30, 18:28:19 »
Dzięki za tą funkcję :)
Na razie pobieżnie przejrzałem to ptrace i wygląda na to, że ta funkcja rozwiązuje wszystkie problemy! W ciągu najbliższych dni, jak już będę miał czas zakodzić to i potesteować napiszę co i jak ;)

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 111
    • Zobacz profil
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #5 dnia: 2009-09-01, 09:23:08 »
Nie wystarczy przeszukać odpowiednich sekcji przed wykonaniem exec? Dla przykładu funkcja dlopen będzie maksymalnie niebezpieczna.

A tak przy okazji - domyślam się, że chcesz stworzyć coś do zabezpieczenia komputera użytkownika - coś, jakby piaskownicę.
Mam podobne rozwiązanie, lecz oparte na specjalnym języku skryptowym i oddające pełną kontrolę użytkownikowi. Mało tego. Nie denerwujemy użytkownika - pokazujemy mu tylko jedno okno dialogowe i tłumaczymy wszystko w czytelny sposób.

Wiem, że ty chcesz pewnie koniecznie mieć rozwiązanie dla programów skompilowanych do postaci binarnej. Jeżeli jednak nie, to dam Ci namiary.

SubArrin

  • Gość
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #6 dnia: 2009-09-05, 19:10:19 »
Chcę napisać bezpieczne środowisko do testowania rozwiązań zadań.
Mam wszystko gotowe, poza zablokowaniem używania niektórych syscalli.
Jak na razie nie udało mi się napisać. Wystarczy mi program, który uruchomi inny po forku i wyświetli mi syscalle, które tamten wywołał...

Rozwiązania są najpierw kompilowane przez mój program, później odpalane, ale mimo wszystko bardzo trudno napisać funkcję, która na podstawie kodu powie, czy po skompilowaniu jest szansa, że dany syscall będzie wywołany

Offline

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 111
    • Zobacz profil
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #7 dnia: 2009-09-06, 12:49:31 »
Głównym problemem wydają się przerwania systemowe(dla programów binarnych). Bez zapoznaniem się z jakimś specjalnym API z przestrzeni użytkownika lub jądra się nie obejdzie.


Jeżeli masz dostęp do kodu źródłowego, to możesz coś pokombinować z GCO(N)V lub z jakimś profilerem. Jest jeszcze wtedy GDB. W innym przypadku, to pozostaje Ci skrypt powłoki, gdzie użyjesz jakiegoś Trace lub poszukać o odpowiednich wywołaniach(Program musi chyba wtedy pracować w trybie krokowym).

SubArrin

  • Gość
Filtrowanie syscalli w forkowanym programie
« Odpowiedź #8 dnia: 2009-09-06, 13:36:07 »
Dostęp do kodu mam, ale nie bardzo wiem, jak odróżnić, czy fork() to wywołanie forka systemowego, czy ktoś napisał sobie własną funkcję, którą nazwał fork() i która, powiedzmy, wczytuje dane wejściowe (jak pisałem wcześniej, piszę program sprawdzający rozwiązanie problemów algorytmicznych).

Jak by się zastanowić to przy kompilacji g++ "wie" co i jak zostanie użyte.
Idealnym rozwiązanie byłoby dla mnie "napisanie" / "przeciążenie" czy jak to nazwać niektórych funkcji, czyli:
w kodzie źródłowym jest:
#include
int main(){
    fork();
}
ale zamiast wywołania forka, odpala się fork() napisany przeze mnie, np.
int fork(){
    return 0;
}

Rozwiązaniem, które mam przetestować jest kod źródłowy, więc mój program może go przeglądać, ew. edytować (w bardzo ograniczonym stopniu), sam go kompiluje i odpala.