Project

General

Profile

Actions

Task #524

closed

Základní validace zpráv

Added by Pavel Kácha about 12 years ago. Updated almost 12 years ago.

Status:
Closed
Priority:
Low
Assignee:
Tomáš Plesník
Category:
-
Target version:
Start date:
07/30/2012
Due date:
09/12/2012
% Done:

0%

Estimated time:

Description

V databázi se občas množí nesmyslné zprávy a odesílatel se o tom nemá jak dozvědět - teprve, když to zaregistruje člověk v db (nebo v analytickém klientu). Bylo by vhodné nejčastější chyby detekovat a odmítnout už na vstupu (hlavně neznámý typ zprávy, případně i target_proto, source neodpovídající source_type, detected neobvykle v budoucnu).

Actions #1

Updated by Pavel Kácha about 12 years ago

  • Due date set to 08/12/2012
  • Assignee set to Tomáš Plesník
  • Priority changed from Normal to High

Konfigurační parametr, obsahující hash, jehož klíči budou jména atributů, které chceme validovat, hodnotou seznam povolených řetězců. Atribut, který nebude v hashi jako klíč uveden, nebude validován. Bude potřeba doplnit serverovou dokumentaci.

Např.:

%ValidStrings = (
    "types" => qw(portscan bruteforce phishing),
    "source_type" => qw(ip email)
);

Actions #2

Updated by Tomáš Plesník about 12 years ago

OK, me osobne by se urcite libilo mit validacni hashe nastavovanou pres warden-server.conf, jelikoz nekdo jiny muze pouzivat uplne jine nazvy typu udalosti, atd. a bylo by pro nej velice nekonfortni to hledat nekde ve zdrojacich a prepisovat to tam. Souhlas?

Actions #3

Updated by Pavel Kácha about 12 years ago

Naprostý souhlas, přesně tak jsem to myslel.

Actions #4

Updated by Tomáš Plesník about 12 years ago

Do serveru jsem doplnil validaci typu prichozich udalosti. Spolecne s touto zmenou jsem upravil i warden-server.conf a install.sh. Vse je nakomitovano do GITu, revize ac58da12. Zmenu je potreba doplnit do CHANGELOGu a README.

Actions #5

Updated by Pavel Kácha about 12 years ago

  • Status changed from New to Feedback

Kostějovy připomínky jsou validní, mrkni na to a dej vědět.

use List::Util 'first'; # check validity of event attributes - TYPE
my $valid_types_ref = $VALID_STRINGS{'type'};
my valid_types = $valid_types_ref;
my $match = first { /$type/ } @valid_types;

Snazte se pouzivat nativni funkce misto novych modulu, navrhuji:

my $match = grep /$type/, @{$VALID_STRINGS{'type'}};

Actions #6

Updated by Tomáš Plesník about 12 years ago

Kontrola validity nastaveneho typu udalosti predelana na

my $match = grep /$type/, @{$VALID_STRINGS{'type'}};

Jinak co se tyce Kostejovi poznamky:

Zkouseli jste funkcionalitu prijimace, pokud je prijimaci klient registrovany
jako _any_? Co kdyz bude chtit jen nejaky typ zpravy, projde procesem autorizace,
na prvni pohled se mi zda, ze ne. Pletu se?

V aktualnim stavu je to tak, ze klient by musel mit dve registrace, jednu pro any a druhou pro zvoleny 'type'. Neni problem udelat drobnou upravu tak, aby klient, ktery ma zaregistrovany typ any a prijde pouze s konkretnim typem aby jej take dostal, jelikoz pro any to vlastne znamena, ze ma pristup ke vsem typum udalosti.

Actions #7

Updated by Tomáš Plesník about 12 years ago

Cast o Kostejove poznace patri k ticketu #523, takze jsem ji tam i vlozil, pardon.

Actions #8

Updated by Pavel Kácha about 12 years ago

  • Status changed from Feedback to Resolved

Pro referenci - List::Util->grep: 7d408702

Actions #9

Updated by Pavel Kácha about 12 years ago

Souvisí to blízce s validací - 58f4dd70 přidal typ "probe".

Actions #10

Updated by Pavel Kácha about 12 years ago

  • Status changed from Resolved to Feedback

Mít ve %VALID_STRINGS{"type"} i "_all_" není dobrý nápad. To je hodnota, která se smí vyskytnout jen v clients.type, určitě ne v events.type.

Actions #11

Updated by Tomáš Plesník about 12 years ago

Pavel Kácha wrote:

Mít ve %VALID_STRINGS{"type"} i "_all_" není dobrý nápad. To je hodnota, která se smí vyskytnout jen v clients.type, určitě ne v events.type.

Ano to mas naprostou pravdu. Vyhozeno z hashe.

Actions #12

Updated by Pavel Kácha about 12 years ago

  • Status changed from Feedback to Resolved

6bec233b - Pokud "type" ve %VALID_STRINGS nebo samotny %VALID_STRINGS neni definovan, nevaliduj, prijmi cokoliv + uprava regularniho vyrazu v grepu na levnejsi "eq".

Actions #13

Updated by Tomáš Plesník about 12 years ago

Tak, dival jsem se na dalsi polozky, ktere jsou ukladany do DB a je potreba je validovat. Moje napady na moznost validace jsou nasledujici:

$id - neni potreba validovat, sekvence generovana v DB
$hostname - neni potreba validovat, server si jej zjistuje z certifikatu, anebo je mozne pomoci modulu Data::Validate::Domain, nebo regexp
$service - neni potreba validovat, server nezna nazvy vsech klientskych sluzeb, ktere posilaji data
$detected - muzeme validovat jestli neni nastaven cas z budoucnosti nebo format data
$received - neni potreba validovat, nastaveno serverem
$type - validace hotova
$source_type - muzeme validovat, jesli je nastavena [IP, URL, Reply-To:, null] (viz README); musi se validovat spolecne s $source
$source - muzeme validovat IPv4/IPv6 adresu, korektni URL, korektni mailovou adresu; musi se validovat spolecne s $source_type
$target_proto - muzeme validovat, ale bylo by to 256 protokolu pro L3 a 1024 pro L4 (pokud to omezime pouze na rezervovane porty) (viz README)
$target_port - muzeme validovat, na hodnotu mezi 0-65535
$attack_scale - muzeme validovat, na unsigned int
$note - neni potreba validovat, melo by stacit ze je escapovana DB handlerem
$priority - muzeme validovat, na unsigned int
$timeout - muzeme validovat, na unsigned int
$valid - neni potreba validovat, nastaveno serverem

Actions #14

Updated by Pavel Kácha about 12 years ago

  • Due date changed from 08/12/2012 to 09/12/2012
  • Priority changed from High to Low

Co jsem umazal, s tím souhlasím a není třeba řešit.

$hostname - neni potreba validovat, server si jej zjistuje z certifikatu, anebo je mozne pomoci modulu Data::Validate::Domain, nebo regexp

Předpokládám správně, že pokud uvede špatné hostname, dostane peška při autentizaci?

$detected - muzeme validovat jestli neni nastaven cas z budoucnosti nebo format data

Co se stane, pokud přijde špatný formát? V db je typ timestamp, takže někde musí dojít ke konverzi a chybě nebo výjimce, pletu se?

$source_type - muzeme validovat, jesli je nastavena [IP, URL, Reply-To:, null] (viz README); musi se validovat spolecne s $source

Byl bych pro rudimentární validaci pomocí %VALID_STRINGS, když už je máme. V jaké podobě může být 'null'? Jako string?

$source - muzeme validovat IPv4/IPv6 adresu, korektni URL, korektni mailovou adresu; musi se validovat spolecne s $source_type

Veďme obojí v patrnosti, pokud analytici (Honza, Bodík, Dan) přijdou s tím, že jsou někde nesmysly, budeme řešit.

$target_proto - muzeme validovat, ale bylo by to 256 protokolu pro L3 a 1024 pro L4 (pokud to omezime pouze na rezervovane porty) (viz README)

To by byl overkill, nechme bez validace.

$target_port - muzeme validovat, na hodnotu mezi 0-65535
$attack_scale - muzeme validovat, na unsigned int
$priority - muzeme validovat, na unsigned int
$timeout - muzeme validovat, na unsigned int

V db je jako int(2) nebo int(4), takže by při snaze zapsat jinou hodnotu měla někde vzniknout chyba už teď, jako u $detected, nebo ne?

Jinak tu snižuju prioritu, $type nás bolel nejvíc, pokud další nestihneme do vydání, nevadí.
Actions #15

Updated by Tomáš Plesník almost 12 years ago

Pavel Kácha wrote:

Co jsem umazal, s tím souhlasím a není třeba řešit.

$hostname - neni potreba validovat, server si jej zjistuje z certifikatu, anebo je mozne pomoci modulu Data::Validate::Domain, nebo regexp

Předpokládám správně, že pokud uvede špatné hostname, dostane peška při autentizaci?

Ano, to souhlasi.

$detected - muzeme validovat jestli neni nastaven cas z budoucnosti nebo format data

Co se stane, pokud přijde špatný formát? V db je typ timestamp, takže někde musí dojít ke konverzi a chybě nebo výjimce, pletu se?

Zde by to ale asi chtelo regexpem kontrolovat format YYYY-MM-DDTHH:MM:SS, jelikoz kdyz jsem jako 'detected' nastavit treba 2012-09-10TT09:05:03, tak db z toho udelala 2012-09-10 00:00:00.

$source_type - muzeme validovat, jesli je nastavena [IP, URL, Reply-To:, null] (viz README); musi se validovat spolecne s $source

Byl bych pro rudimentární validaci pomocí %VALID_STRINGS, když už je máme. V jaké podobě může být 'null'? Jako string?

OK, takze do %VALID_STRINGS se nastavi [IP, URL, Reply-To:, null]. null muzeme but dat jako string a na serveru z nej udelat databazovy null, nebo pouzit undef a opet z nej na serveru udelat DB null, at zbytecne nezabere misto.

$source - muzeme validovat IPv4/IPv6 adresu, korektni URL, korektni mailovou adresu; musi se validovat spolecne s $source_type

Veďme obojí v patrnosti, pokud analytici (Honza, Bodík, Dan) přijdou s tím, že jsou někde nesmysly, budeme řešit.

Dobre, pockame co casem kluci.

$target_proto - muzeme validovat, ale bylo by to 256 protokolu pro L3 a 1024 pro L4 (pokud to omezime pouze na rezervovane porty) (viz README)

To by byl overkill, nechme bez validace.

Dobre, naprosty souhlas.

$target_port - muzeme validovat, na hodnotu mezi 0-65535
$attack_scale - muzeme validovat, na unsigned int
$priority - muzeme validovat, na unsigned int
$timeout - muzeme validovat, na unsigned int

V db je jako int(2) nebo int(4), takže by při snaze zapsat jinou hodnotu měla někde vzniknout chyba už teď, jako u $detected, nebo ne?

Presne je to:

`target_port` int(2) default NULL,
`attack_scale` int(4) default NULL,
`priority` int(1) default NULL,
`timeout` int(2) default NULL,

Zkousel jsem ted ale do DB ulozit jako $target_port hodnotu -11 a proslo to a DB je -11.

Jinak tu snižuju prioritu, $type nás bolel nejvíc, pokud další nestihneme do vydání, nevadí.

Dobre, pokusim se tam ale dostat co nejvice veci.

Actions #16

Updated by Tomáš Plesník almost 12 years ago

Tomáš Plesník wrote:

$source_type - muzeme validovat, jesli je nastavena [IP, URL, Reply-To:, null] (viz README); musi se validovat spolecne s $source

Byl bych pro rudimentární validaci pomocí %VALID_STRINGS, když už je máme. V jaké podobě může být 'null'? Jako string?

OK, takze do %VALID_STRINGS se nastavi [IP, URL, Reply-To:, null]. null muzeme but dat jako string a na serveru z nej udelat databazovy null, nebo pouzit undef a opet z nej na serveru udelat DB null, at zbytecne nezabere misto.

Hodnotu 'null' vyhodime z validacni hashe a dokumentace, nikdo jej totiz zatim nepouzil. Pokud nekdo bude potrebovat, tak pridame.

Actions #17

Updated by Tomáš Plesník almost 12 years ago

Tomáš Plesník wrote:

$target_port - muzeme validovat, na hodnotu mezi 0-65535
$attack_scale - muzeme validovat, na unsigned int
$priority - muzeme validovat, na unsigned int
$timeout - muzeme validovat, na unsigned int

V db je jako int(2) nebo int(4), takže by při snaze zapsat jinou hodnotu měla někde vzniknout chyba už teď, jako u $detected, nebo ne?

Presne je to:

`target_port` int(2) default NULL,
`attack_scale` int(4) default NULL,
`priority` int(1) default NULL,
`timeout` int(2) default NULL,

Zkousel jsem ted ale do DB ulozit jako $target_port hodnotu -11 a proslo to a DB je -11.

Ochranu provedeme pomoci zmeny typu sloupcu v DB na unsigned int a nechame tudiz rozhodovani na DB. Overime, zdali je mozne zaporne cislo do DB ulozit. Pri presunu na produkcni server zkontrolovat jiz ulozena data.

Actions #18

Updated by Tomáš Plesník almost 12 years ago

Hodnoty validacni hashe se zmeni na regexpy (ze seznamu s vyctem), podle kterych se budou kontorolovat uzivatelska data pred ulozenim do DB.

Actions #19

Updated by Tomáš Plesník almost 12 years ago

  • Status changed from Resolved to In Progress
Actions #20

Updated by Tomáš Plesník almost 12 years ago

Premyslim nad temi regexpy a rikam si jestli by nebylo opravdu lepsi nechat parametry:

$target_port
$attack_scale
$priority
$timeout

interne validovat serverem (vyhodit je z validovaci hashe), jelikoz je stejne zadny spravce zmenit nemuze - to by musel predelat cenou databazi. A to same i u

$detected

a validovat ho zparsovanim pomoci modulu DateTime::Format::Strptime.

Ostatni dva parametry $type a $source_type bych dal jako vycet moznosti pomoci pole. Pro spravce mi to opravdu prijde stravitelnejsi.

Actions #21

Updated by Pavel Kácha almost 12 years ago

Myslím si, že než se server dostane k někomu, kdo si s ním bude mít zájem hrát, bude už dost pravděpodobně vypadat výrazně jinak. Ale máš pravdu, že tyhle parametry správce definovat v současné době prakticky nijak nemůže. Ok, beru argument, zkus to tak, vyhneme se prozatím regexpům - ještě je otázka, zda dokážeš dát dohromady spolehlivý parsovací strptime řetězec.

Actions #22

Updated by Tomáš Plesník almost 12 years ago

Server ma hotovu validaci jednotlivych polozek udalosti, vse je ulozeno v GITu, 697a22dd. Jen pro prehlednost udelam rekapitulaci:

$id - neni potreba validovat, sekvence generovana v DB
$hostname - neni potreba validovat, server si jej zjistuje z SSL certifikatu
$service - neni potreba validovat, zavisi na registraci klienta
$detected - validace pomoci interniho regexpu
$received - neni potreba validovat, nastaveno serverem
$type - validace pomoci validacni hashe
$source_type - validace pomoci validacni hashe
$source - neni potreba validovat
$target_proto - neni potreba validovat
$target_port - validace pomoci interniho regexpu
$attack_scale - validace pomoci interniho regexpu
$note - neni potreba validovat
$priority - validace pomoci interniho regexpu
$timeout - validace pomoci interniho regexpu
$valid - neni potreba validovat, nastaveno serverem

Pokud proti tomu nikdo nic nema, tak muzeme ticket uzavrit.

Actions #23

Updated by Pavel Kácha almost 12 years ago

  • Status changed from In Progress to Resolved

$detected: strptime neklaplo?

Actions #24

Updated by Tomáš Plesník almost 12 years ago

Pavel Kácha wrote:

$detected: strptime neklaplo?

No tak nejak. Nasel jsem funkcni regexp a tak jsem to vsechno dal do regexpu ale kontrola se provadi interne na serveru a funguje to .

Actions #25

Updated by Pavel Kácha almost 12 years ago

  • Status changed from Resolved to Closed
Actions

Also available in: Atom PDF