<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C, PHP, VB, .NET &#187; ПТСК</title>
	<atom:link href="http://www.cphpvb.net/category/network-security/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cphpvb.net</link>
	<description>дневникът на Филип Петров</description>
	<lastBuildDate>Mon, 30 Jan 2012 16:44:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Доклади по ПТСК от 2011г.</title>
		<link>http://www.cphpvb.net/network-security/6928-reports-2011/</link>
		<comments>http://www.cphpvb.net/network-security/6928-reports-2011/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 19:58:39 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=6928</guid>
		<description><![CDATA[Курсът по ПТСК се провежда от две години, като още от самото начало започнахме инициатива студентите да пишат доклади по тяхно желание допълнително извън програмата на учебния предмет. Тази година реших да започна и инициатива за публикуване на трите най-добри доклада (според мен). Критерият за този избор е чисто субективен (мое лично мнение), а подреждането [...]]]></description>
			<content:encoded><![CDATA[<p>Курсът по ПТСК се провежда от две години, като още от самото начало започнахме инициатива студентите да пишат доклади по тяхно желание допълнително извън програмата на учебния предмет. Тази година реших да започна и инициатива за публикуване на трите най-добри доклада (според мен). Критерият за този избор е чисто субективен (мое лично мнение), а подреждането ще бъде по азбучен ред (без класация между първите трима). Преценката ми се базира на два критерия &#8211; докладът сам по себе си и представянето му по време на учебния час.</p>
<p>Ето и първите три доклада от 2011г.:<span id="more-6928"></span></p>
<ul>
<li>Боян Лазаров &#8211; <a href="http://www.cphpvb.net/wp-content/uploads/2011/04/Boqn-Lazarov-Doklad-PTSK_referat.pdf">Flash Security</a>;</li>
<li>Гаро Гарабедян &#8211; <a href="http://www.cphpvb.net/wp-content/uploads/2011/04/Garo-Garabedian-doklad-CSRF-on-JSON-data.pdf">CSRF с JSON данни</a> + <a href="http://www.cphpvb.net/wp-content/uploads/2011/04/Garo-Garabedian-prezentacia-CSRF_on_JSON_data.pdf">презентация</a>. Може да бъде намерен и на личния сайт на студента <a title="CSRF on JSON data" href="http://garabedyan.wordpress.com/2011/04/13/csrf-on-json-data/" target="_blank">тук</a>;</li>
<li>Илиян Недялков &#8211; <a href="http://www.cphpvb.net/wp-content/uploads/2011/04/Ilian-Nedialkov-Doklad-PHPSESSID.docx">Ентропия на PHPSESSID</a>.</li>
</ul>
<p>Прикачил съм ги без никаква редакция, т.е. във вида, в който са ми били представени. Това не е официално зададен проект, затова и изискванията формално може да не са спазени. Приятно четене.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/6928-reports-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Сравнения и типове данни в PHP</title>
		<link>http://www.cphpvb.net/network-security/5571-%d1%81%d1%80%d0%b0%d0%b2%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b8-%d1%82%d0%b8%d0%bf%d0%be%d0%b2%d0%b5-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d0%b2-php/</link>
		<comments>http://www.cphpvb.net/network-security/5571-%d1%81%d1%80%d0%b0%d0%b2%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b8-%d1%82%d0%b8%d0%bf%d0%be%d0%b2%d0%b5-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d0%b2-php/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 17:36:50 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=5571</guid>
		<description><![CDATA[PHP е един много популярен език за програмиране в днешно време. Може би това главно се дължи на липсата на строго типизиране на данните и автоматичното им превръщане от един тип в друг при нужда. Програмистите изглежда са мързеливи хора и за това PHP им харесва. Това обаче може да ви доведе до сериозни главоболия [...]]]></description>
			<content:encoded><![CDATA[<p>PHP е един много популярен език за програмиране в днешно време. Може би това главно се дължи на липсата на строго типизиране на данните и автоматичното им превръщане от един тип в друг при нужда. Програмистите изглежда са мързеливи хора и за това PHP им харесва. Това обаче може да ви доведе до сериозни главоболия и купове непредвидени грешки. Нека демонстрираме с един примерен код:<span id="more-5571"></span></p>
<pre>$var1 = 'blablabla';
$var2 = 0;
if ($var1==true &amp;&amp; $var2==false &amp;&amp; $var1==$var2){
    echo ('WTF');
}</pre>
<p>Логически погледнато условието &#8222;$var1==true &amp;&amp; $var2==false &amp;&amp; $var1==$var2&#8243; би трябвало винаги да върне false. Да, но не &#8211; пробвайте и на екрана ще видите едно WTF! Ето какво се получава:</p>
<ol>
<li>&#8222;$var1==true&#8220; връща true, защото променливата $var1 не е празна;</li>
<li>&#8222;$var2==false&#8220; връща true, защото стойността на $var2 е 0, което отговаря на стойността на константата false;</li>
<li>&#8222;$var1==$var2&#8243; магически също връща true, защото низът &#8216;blablabla&#8217; автоматично се превръща в цяло число, което очевидно е 0, а 0 си е равно на 0.</li>
</ol>
<p>Уплашихте ли се? За щастие конкретно за този проблем има лек и той е операторът &#8222;===&#8220;, който означава &#8222;идентично равно по стойност на&#8220;. За разлика от &#8222;==&#8220; (равно по стойност на), операторът ще търси освен равни стойности и еднакви типове данни.</p>
<p>Силно препоръчвам от гледна точка на сигурността на вашия код да използвате именно оператор &#8222;===&#8220;, особено когато сравняваме данни подадени от потребител. В противен случай даваме възможно поле за изява на объркана програмна логика, която може да доведе до напълно неподозирани пробиви в сигурността.</p>
<p>Други типични PHP проблеми могат да възникнат при неинициализирани променливи. Какво мислите ще се случи, ако използвате променлива, която никога преди това не сте я инициализирали? Отговор &#8211; няма проблем, просто ще бъде хвърлен един &#8222;Undefined variable&#8220; notice ако пазите разширен лог файл (в повечето случаи дори няма да забележите). Променливата ще бъде инициализирана със стойността по подразбиране (в зависимост от контекста ще бъде &#8222;&#8220;, 0, false или null). Затова винаги инициализирайте променливите си &#8211; дори те да трябва да са със стойности по подразбиране! Всъщност напук на първосигналната логика &#8211; този &#8222;спестен&#8220; ред код (от пропускането на дефиниране на променлива) всъщност забавя бързодействието на програмата, вместо да помага.</p>
<p>Накрая ще спомена за още един типичен PHP проблем, който заблуждава програмистите &#8211; проверката за това дали променлива има някаква стойност (функция isset()) и дали променливата е празна (функция empty()). Когато използвате isset вие проверявате просто дали променливата е инициализирана. Например една променлива $string=&#8220;" е празна, но все пак е дефинирана. Функцията empty() връща булева стойност и проверява за:</p>
<ol>
<li>&#8222;&#8220; или &#8220;- празен низ;</li>
<li>0 &#8211; цяло число 0;</li>
<li>&#8222;0&#8243; или &#8217;0&#8242; &#8211; нула като низ;</li>
<li>null &#8211; празна стойност;</li>
<li>false &#8211; булева стойност &#8222;неистина&#8220;;</li>
<li>array() &#8211; празен масив;</li>
<li>var $var &#8211; променлива в class без стойност.</li>
</ol>
<p>Особени проблеми с empty() поражда точка 3. Например отговор &#8222;0&#8243; на въпроса &#8222;колко пари получавате като заплата на месец&#8220; би бил логически валиден ако сте безработен, но ако използвате функцията &#8222;empty()&#8220; ще получите true, т.е. функцията приема, че получения низ/число е празен. Ето един практичен пример &#8211; търсим дали дадена дума се среща в текст и използваме позицията й:</p>
<pre>$string  = "Philip Petrov";
$var = strpos($string, "Philip");
if(empty($var)){ // грешна проверка - ще върне true
    echo 'The word "Philip" is not found in the text!';
}</pre>
<p>Функцията strpos() връща число (на коя позиция се среща търсения низ в дадения) или false в случай, че търсения низ не е намерен. Тъй като както казахме empty() ще върне true при стойност на променливата&#8220;false&#8220; и ще върне true при подадено цяло число. Да, но забравихме за цялото число 0, нали? Затова и сравнението е неправилно, защото се получава частен случай. Това поведение на функцията empty() всъщност е напълно логично ако се върнете в първата част на статията &#8211; всъщност empty($var) е отрицанието на (boolean)$var (превръщането на променливата $var в булев тип),т.е. същия проблем се получава често при хората, които не  използват функции, а разчитат директно на превръщане на типовете, като  например условия като &#8222;if($var)&#8230;&#8220;. Затова много внимавайте коя функция къде се използва и следвайте добре програмната логика. Най-общо казано &#8211; просто не ползвайте empty(), а си пишете условията сами. Иначе примерът от по-горе трябва да се пренапише така:</p>
<pre>$string  = "Philip Petrov";
$var = strpos($string, "Philip");
if($var===false){ // правилна проверка
    echo 'The word "Philip" is not found in the text!';
}</pre>
<p>Описаният по-горе проблем може да се формулира по-простичко &#8211; PHP третира числото 0 като false, що се отнася до булеви сравнения. Затова много се пазете от него. Много функции като strpos могат да върнат 0, което да се интерпретира като false и това да обърка програмната ви логика.</p>
<p>Колкото до isset() &#8211; добре е да го използваме когато не сме сигурни какво става с данните &#8222;над нас&#8220;. Например една проверка &#8222;if($var&lt;6)&#8230;&#8220; ще върне true, ако променливата $var не е инициализирана (тя ще се инициализира със стойност по подразбиране 0, а условието 0&lt;6 е истина). Когато работим в екип не е изключено да получим подобен &#8222;подарък&#8220; от колега. Затова когато програмиране в &#8222;несигурна среда&#8220; използвайте винаги условието в комбинация с isset(), т.е. от примера &#8222;if(isset($var) &amp;&amp; $var&lt;6)&#8230;&#8220;. Но за да ви уплашим още повече от езика за програмиране PHP ще трябва да споменем, че променливи инициализирани със стойност &#8222;null&#8220; се третират от isset() като &#8222;неинициализирани&#8220;. Например следният код ще изпише на екрана &#8222;not initialized&#8220;:</p>
<pre>$var = null;
if (isset($var)) echo "initialized";
else echo "not initialized";</pre>
<p>С други думи точното определение на isset() е &#8222;проверява дали променливата е инициализирана и има стойност (т.е. не е null)&#8220;. Помнете и тази подробност и се пазете от грешки. Съществува функция is_null(), която за нещастие връща &#8222;true&#8220; при подадена неинициализирана променлива. Изобщо PHP и в момента страда от липсата на истинска is_defined() функция. Затова спазвайте един съвет от мен &#8211; нека докато разработвате вашите скриптове винаги имате една команда &#8222;error_reporting( E_ALL );&#8220; в началото на всеки PHP файл. Когато свършите работа и изчистите всички възможни грешки я махнете.</p>
<p>В заключение: PHP ни дава лесна възможност за промяна на типовете данни. По ирония на съдбата именно това &#8222;удобство&#8220; ни задължава много по-стриктно да следим сами типовете данни в PHP отколкото го правим в другите езици. С други думи вместо да ни спести, това &#8222;удобство&#8220; всъщност ни донася допълнитeлна работа. Тук засегнахме само малка част от проблемите, които може да очаквате &#8222;под път и над път&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/5571-%d1%81%d1%80%d0%b0%d0%b2%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f-%d0%b8-%d1%82%d0%b8%d0%bf%d0%be%d0%b2%d0%b5-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d0%b2-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Няколко съвета за по-бързи програми на PHP</title>
		<link>http://www.cphpvb.net/network-security/5558-%d0%bd%d1%8f%d0%ba%d0%be%d0%bb%d0%ba%d0%be-%d1%81%d1%8a%d0%b2%d0%b5%d1%82%d0%b0-%d0%b7%d0%b0-%d0%bf%d0%be-%d0%b1%d1%8a%d1%80%d0%b7%d0%b8-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%b8-%d0%bd%d0%b0-p/</link>
		<comments>http://www.cphpvb.net/network-security/5558-%d0%bd%d1%8f%d0%ba%d0%be%d0%bb%d0%ba%d0%be-%d1%81%d1%8a%d0%b2%d0%b5%d1%82%d0%b0-%d0%b7%d0%b0-%d0%bf%d0%be-%d0%b1%d1%8a%d1%80%d0%b7%d0%b8-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%b8-%d0%bd%d0%b0-p/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 16:41:10 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=5558</guid>
		<description><![CDATA[Тази статия определено не е свързана със &#8222;сигурно програмиране&#8220;, но реших, че може все пак да влезне в употреба. През годините съм слушал много съвети за това как да се оптимизира код така, че да отнема минимални ресурси. Естествено основната тежест в такава задача пада върху алгоритмите. Има обаче и други, по-дребни &#8222;трикчета&#8220;, които отнемат [...]]]></description>
			<content:encoded><![CDATA[<p>Тази статия определено не е свързана със &#8222;сигурно програмиране&#8220;, но реших, че може все пак да влезне в употреба. През годините съм слушал много съвети за това как да се оптимизира код така, че да отнема минимални ресурси. Естествено основната тежест в такава задача пада върху алгоритмите. Има обаче и други, по-дребни &#8222;трикчета&#8220;, които отнемат някоя друга милисекунда от времето за изпълнение. Честно казано никога не съм бил привърженик на този род оптимизации, защото най-често правят кода нечетим. Въпреки това ще споделя някои неща, които съм запомнил през времето, като обръщам внимание на езика PHP:<span id="more-5558"></span></p>
<ol>
<li><strong>Инкрементиране на променлива</strong>: &#8222;++$i&#8220; е по-бързо от &#8222;$i++&#8220; &#8211; специално в PHP това се получава, защото второто изисква създаването на временна променлива. Ако не желаете да помните този факт &#8211; използвайте $i = $i+1. Същото естествено важи и за оператора за декрементиране (&#8211;);</li>
<li><strong>Проверка за дължина на низ</strong>: стандартно когато проверяваме дали един низ $string е с по-малко символи от дадена дължина $len ние правим &#8222;if (strlen($string)&lt;$len) &#8230;&#8220;. Доста по-бързо е ако направим тази операция като &#8222;if (!isset($string[$len])) &#8230;&#8220;. На първо място не броим символите на $string &#8211; от там нататък всички допълнителни разяснения са бонус към бързината;</li>
<li><strong>Отпечатване на екрана</strong>: аз лично не съм виждал хора, които печатат на екрана с print или printf, но все пак ако има &#8211; echo е доста по-бързо. Това е защото то не връща стойност. За самото echo &#8211; параметризираното echo e по-бързо отколкото конкатенацията на низове в echo (за справка как се прави &#8211; прочетете документацията на echo). Друга тънкост е, че когато текстът е статичен, то е по-добре да затворите тага &lt;?php с ?&gt;, да напишете текста в чист HTML код и да си отворите отново &lt;?php таг, за да продължите. С други думи &#8211; ако текста не е прекалено къс и си заслужава, то можете да минете въобще без echo;</li>
<li><strong>Граници за цикъл</strong>: много често хората пишат код като &#8222;for($i=0;$ i&lt;count($arr); $i++)&#8230;&#8220;. Вече знаем тънкостта за оператора за инкрементиране. Има обаче и още един проблем &#8211; функцията count се извиква на всяко завъртане на цикъла. Затова този код може да бъде пренаписан като: &#8222;for($i=0,$k=count($arr);$i&lt;$k;$i=$i+1)&#8230;&#8220;. За този конкретен пример също толкова добре се представя foreach, който по някакъв начин си е оптимизиран по описания начин вътрешно: &#8222;for($i in $arr)&#8230;&#8220;;</li>
<li><strong>Кавички за низове</strong>: някои хора казват, че &#8222;низ&#8220; (с двойни кавички) се компилира по-бавно от &#8216;низ&#8217;. Склонен съм да вярвам. Причината е, че двойните кавички позволяват вмъкване на стойност от променлива, например &#8222;стойността е $i&#8220; (тук ще се отпечата стойността на $i), докато единичните кавички интерпретират всичко вътре като символи, например &#8216;стойността е $i&#8217; (тук ще се отпечатат просто символите &#8216;$&#8217; и &#8216;i&#8217;, но не и стойността на променливата). Ако все пак ви се наложи да отпечатвате стойността на променливата в текста &#8211; вместо двойни кавички използвайте функцията sprintf(). Резултатът от &#8222;парсването&#8220; е в пъти по-бърз!;</li>
<li><strong>Вмъкване на файлове</strong>: ако пишете кода си добре и не се нуждаете от проверка &#8211; използвайте require() вместо require_once(). Грубо казано ще си спестите един if :);</li>
<li><strong>Текущо време</strong>: малко хора знаят, но текущото време (функцията time()) се извиква при всяко зареждане на скрипт и се записва в $_SERVER[’REQUEST_TIME’]. Затова защо да извикваме time() отново, като можем да използваме директно вече записаната променлива?;</li>
<li><strong>Вложени логически оператори</strong>: колкото и да е дразнещо за пригледността на кода &#8222;if-else-if-else&#8230;&#8220; е по-бързо от &#8222;switch()&#8220;;</li>
<li><strong>Извикване на елемент на масив</strong>: просто $arr['name'] е по-бързо от $arr[name]. Доколкото знам във втория случай компилаторът прави проверка дали имате в предвид променлива или константа. Когато види, че не е променлива (не започва с &#8216;$&#8217;) &#8211; ще го приеме за константа. В първия случай ние директно указваме константа;</li>
<li><strong>Локални дрещу глобални променливи</strong>: при всички случаи работата с локални променливи е по-бърза от работа с глобални.</li>
</ol>
<p>Засега това са нещата, за които се сетих. Ако се сетя за още &#8211; ще допълвам.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/5558-%d0%bd%d1%8f%d0%ba%d0%be%d0%bb%d0%ba%d0%be-%d1%81%d1%8a%d0%b2%d0%b5%d1%82%d0%b0-%d0%b7%d0%b0-%d0%bf%d0%be-%d0%b1%d1%8a%d1%80%d0%b7%d0%b8-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%b8-%d0%bd%d0%b0-p/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Настройки на php.ini</title>
		<link>http://www.cphpvb.net/network-security/5515-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d0%bd%d0%b0-php-ini/</link>
		<comments>http://www.cphpvb.net/network-security/5515-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d0%bd%d0%b0-php-ini/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 20:15:41 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=5515</guid>
		<description><![CDATA[Файлът php.ini съдържа основните настройки за програмната среда PHP. Той съдържа изключително много променливи, но ние ще се спрем само над най-важните. Структурата е &#60;име на променлива&#62; = &#60;стойност&#62;. short_open_tag &#8211; Един PHP файл може да съдържа &#8222;микс&#8220; между HTML и PHP код. Стандартно кода се огражда с &#60;?php &#8230; ?&#62;. Кратките тагове позволяват това [...]]]></description>
			<content:encoded><![CDATA[<p>Файлът php.ini съдържа основните настройки за програмната среда PHP. Той съдържа изключително много променливи, но ние ще се спрем само над най-важните. Структурата е &lt;име на променлива&gt; = &lt;стойност&gt;.<span id="more-5515"></span></p>
<ol>
<li><strong>short_open_tag</strong> &#8211; Един PHP файл може да съдържа &#8222;микс&#8220; между HTML и PHP код. Стандартно кода се огражда с &lt;?php &#8230; ?&gt;. Кратките тагове позволяват това да става с &lt;? &#8230; ?&gt;. По принцип се счита за лоша практика и е добре да го избягвате &#8211; стандартно дръжте стойността на off;</li>
<li><strong>output_buffering</strong> &#8211; стандартно трябва да инициализираме сесиите в PHP преди да са изпратени каквито и да е headers в HTTP протокола. Затова и стандартно output_buffering е off. Възможно е да дадем стойност, например 2048 байта, с която да направим буфер, в който да може да се записва информацията от HTTP headers и да бъде изпращана след инициализиране на сесията. Така сесията може да се инициализира навсякъде. Това е изключително лоща практика, която освен всичко има лош ефект върху производителността. Затова винаги дръжте стойността на off и винаги стартирайте сесиите преди всичко останало;</li>
<li><strong>expose_php</strong> &#8211; стойността по подразбиране е &#8222;on&#8220;, което изначава, че в http headers се изпраща версията на PHP. Принципно това е безсмислена информация &#8211; добре е да я скриете. Затова &#8222;добрата стойност&#8220; е &#8222;off&#8220;;</li>
<li><strong>include_path</strong> &#8211; посочват се директориите с библиотеки, т.е. файловете в тях могат да се викат с &#8222;include&#8220; без да се указва път. Стандартно в include_path се съдържа текущата директория &#8222;.&#8220;. Ако искате да добавите втора, то се използва разделител от двуеточие, например: &#8222;.:/usr/local/lib/php/pear:&#8220;;</li>
<li><strong>error_reporting</strong> &#8211; първоначално начинаещите администратори си мислят, че не е добре да дават информация на потребителите за това какви грешки се случват в системата. Променливата error_reporting е нещо като &#8222;глобална&#8220; за &#8222;рапорт на грешки&#8220;. Наистина не бихме искали заради грешка в приложението ни да се показват грешки в браузъра на клиентите. Но не е и добре никога да не разбираме за тези грешки. Затова дръжте тази променлива със стойността по подразбиране E_ALL и използвайте следващите изброени променливи за настройка;</li>
<li><strong>display_errors</strong> &#8211; указва дали да се показват грешките в стандартната конзола. По подразбиране е &#8222;on&#8220;, което е добро само за машини за разработчици. На &#8222;production server&#8220; го дръжте винаги на &#8222;off&#8220; &#8211; вашите клиенти не трябва да виждат warnings и errors;</li>
<li><strong>display_startup_errors</strong> &#8211; също както display_errors, ние не бихме искали да показваме, че имаме проблеми по време на стартирането на PHP. Затова и тази стойност е добре да бъде &#8222;off&#8220;;</li>
<li><strong>log_errors</strong> &#8211; по време на разработката на приложение обикновено има много грешки и държим стойността на &#8222;off&#8220;. Когато става дума за приложение в реална среда обаче нещата се променят &#8211; там сме скрили грешките от потребителите, но ние лично се интересуваме сериозно когато те се появяват. Затова е добре да сложим стойността на &#8222;on&#8220; и редовно да преглеждаме този log файл;</li>
<li><strong>error_log</strong> &#8211; като стойност указва името на log файла;</li>
<li><strong>log_errors_max_len</strong> &#8211; максимална дължина на лог файла в байтове;</li>
<li><strong>ignore_repeated_errors</strong> &#8211; по подразбиране е изключено (стойност 0). Ако се включи, то в лог файла ще бъдат записвани само уникални грешки;</li>
<li><strong>report_memleaks</strong> &#8211; по позразбиране стойността е true (т.е. 1). Указва дали да се записват в лог файла грешки свързани с утечки на памет;</li>
<li><strong>extension_dir </strong>- указва пътя (директорията) в която се намират разширенията на PHP. До PHP5 включително не е възможно да имаме разширения от различни директории, т.е. стойността на тази променлива е само една директория. Обикновено не я променяме, а пазим стандартните пътища;</li>
<li><strong>safe_mode</strong> &#8211; по подразбиране е изключено. От PHP6 тази опция ще бъде премахната (т.е. перманентно изключена). Ако се включи, то се презаписват include_path с директория зададена в 15. Също така се задава специална директория, в която да могат да се изпълняват външни програми с exec();</li>
<li><strong>safe_mode_include_dir</strong> &#8211; директорията за include_path при включен safe mode;</li>
<li><strong>safe_mode_exec_dir</strong> &#8211; директорията от която могат да се стартират външни програми с exec();</li>
<li><strong>open_basedir</strong> &#8211; указва &#8222;главната&#8220; директория за PHP. Добра идея е да организирате сайтовете на потребителите си в специфична директория, например в /home, и да забраните на PHP скриптове да излизат извън нея. Затова се грижи open_basedir;</li>
<li><strong>max_execution_time</strong> &#8211; не е добре вашите скриптове да изпадат в безкрайни цикли и да натоварват сървъра ни. Всъщност това е и потенциална атака към стабилността. Затова е добре да изберем разумно максимално време за изпълнение на скрипт в секунди. Естествено понякога това има и своята вреда &#8211; скриптове, които отварят мрежови връзки, или такива изпълняващи множество тежки операции, може да не успеят да завършат своята работа;</li>
<li><strong>register_globals</strong> &#8211; това е &#8222;голямата болка&#8220; на сигурността на PHP. В по-старите версии това &#8222;удобство&#8220; водеше до огромни дупки в сигурността. След PHP4 по подразбиране е &#8222;off&#8220;. Очаква се в PHP6 да бъде премахнато като възможност въобще. Ако бъде включена, то имате възможност да приемате променливи от форми, например &lt;input type=&#8220;text&#8220; name=&#8220;email&#8220; /&gt; директно чрез име на променлива (от примера $email), вместо стандартния начин $_POST['email'] или $_REQUEST['email']. Същото важи и за GET заявки. Силно препоръчваме да НЕ пускате register_globals никога. Ако даден стар софтуер не работи &#8211; поправете го, но не правете компромис със сигурността!;</li>
<li><strong>post_max_size</strong> &#8211; стандартно 8M, това указва максималното количество данни, което получаваме с POST заявки. Ако нямаме форми получаващи файлове, то можем спокойно да намалим стойността драстично. Това ще намали ефекта от потенциални атаки с невалидни заявки;</li>
<li><strong>max_input_time</strong> &#8211; нова променлива от PHP5, която указва какво е максималното време в секунди, за което PHP ще обработва POST заявки. Ако не очакваме голями POST заявки, то е добре да го намалим. Стойността винаги е разумно да е по-малка или равна на max_execution_time &#8211; в противен случай е безсмислена стойност;</li>
<li><strong>memory_limit</strong> &#8211; стандартно 8M &#8211; указва максималната RAM памет, която може да използва един PHP скрипт. Хубаво е да изчислявате теоретичния максимум памет за вашият &#8222;най-тежък&#8220; скрипт и да слагате лимит на паметта спрямо него. Имайте в предвид, че със сигурност стойността трябва да е по-голяма от post_max_size, защото информацията от POST заявките също се включват в общата използвана памет;</li>
<li><strong>register_argc_argv</strong> &#8211; важи само при извикване на скрипт през командния ред. Това са допълнителните параметри, които се подават към приложението. Рядко извикваме скриптове от командния ред, а още по-рядко им предаваме параметри. Затова го дръжте &#8222;false&#8220;;</li>
<li><strong>register_long_arrays</strong> &#8211; всяко модерно приложение ще го държи на стойност false. Тази стойност ще забрани остарелите $HTTP_GET_VARS и $HTTP_POST_VARS, които вече са заменени от по-модерните $_POST и $_GET масиви. Освен всичко друго подобрява и бързодействието. Важи само за PHP5 и по-нови версии;</li>
<li><strong>disable_functions</strong> &#8211; ако искате да забраните &#8222;опасни&#8220; функции, то можете да ги изброите при тази променлива. Използва се често при &#8222;несигурна среда&#8220; каквато например е споделен хостинг. Примерна стойност е &#8222;exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source&#8220;.</li>
</ol>
<p>Както споменахме стойностите са много повече, но в общи линии изброените по-горе са най-съществените. Допълнително с повтарящите се променливи &#8222;extension&#8220; можете да добавяте или премахвате разширения. Препоръчваме да добавяте само и единствено разширенията, които използвате.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/5515-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d0%bd%d0%b0-php-ini/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Борбата със спам</title>
		<link>http://www.cphpvb.net/network-security/5458-antispam-fight/</link>
		<comments>http://www.cphpvb.net/network-security/5458-antispam-fight/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 00:19:11 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=5458</guid>
		<description><![CDATA[I. Какво е спам? Едва ли има потребител в интернет, който да не използва електронна поща, та дори и бутафорно само с цел да се регистрира за дадени услуги. От това множество потребители пък едва ли има такива, които не са получавали &#8222;нежелани съобщения&#8220;, които ние вече дори приехме в българския език като чуждицата &#8222;спам&#8220; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>I. Какво е спам?</strong></p>
<p>Едва ли има потребител в интернет, който да не използва електронна поща, та дори и бутафорно само с цел да се регистрира за дадени услуги. От това множество потребители пък едва ли има такива, които не са получавали &#8222;нежелани съобщения&#8220;, които ние вече дори приехме в българския език като чуждицата &#8222;спам&#8220; (spam).</p>
<p>Когато говорим за &#8222;спам&#8220; обикновено го свързваме наистина само и единствено с електронната поща. Естествено съществуват и много други видове спам:<span id="more-5458"></span></p>
<ol>
<li>В коментари под блогове, книги за гости на сайтове;</li>
<li>В социални мрежи;</li>
<li>Във форуми;</li>
<li>По т.нар. Instant Messengers (ICQ, Skype, AIM, и др.);</li>
<li>В масови интернет игри;</li>
<li>SMS по мобилните телефони;</li>
<li>Обаждания по домашния или мобилния телефон;</li>
<li>SEO спам (да, т.нар. spamdexing го приемам за спам и наистина е нежелан).</li>
</ol>
<p>Естествено, че множеството може да се разширява и с всякакви подобни услуги, но главният фокус на обема на понятието пада върху електронните услуги. Що се отнася до уеб-приложенията, които позволяват приемане и визуализация на информация от потребителите (1, 2, 3) &#8211; там сме свидетели на една непрекъсната борба на технологии. Обикновено не говорим за &#8222;лош човек&#8220;, който пуска нежелани съобщения (естествено и такива има, но с тях се &#8222;справяме&#8220; сравнително лесно само с човешка сила &#8211; т.нар. модератори), а за компютърни програми, които злонамелено пускат масово нежелани съобщения (т.нар. &#8222;ботове&#8220;).  Засега най-разпространената защита е <a href="http://www.cphpvb.net/network-security/580-captcha/" target="_blank">captcha</a>, но добиването на все повече компютърна изчислителна мощ все повече и повече затруднява процеса на тази защита, защото изображенията трябва да стават все по-трудни за разпознаване, а от там и все по-непрактични за обикновените потребители. Затова аз лично смятам, че captcha е тактика за защита със затихващи функции &#8211; колкото повече се развива компютърната техника, толкова повече captcha ще става непрактична. Затова в употреба влизат все повече и повече алтернативни услуги като <a href="http://akismet.com/" target="_blank">askimet</a>, които се базират на статистически методи, базирани на данни подадени от потребителите. Положението с IM и игрите (4 и 5) не е по-различно от това на другите уеб-услуги.</p>
<p>Колкото до споменатите SMS спам и нежелани обаждания по телефона (6 и 7) &#8211; там положението е по-скоро законодателно, отколкото технологично. Този вид спам е скъп  &#8211; обикновено той се прилага единствено от много големи корпорации, които обикновено клонят или са монополисти в бранша си. В такъв случай наистина проблема става политически и правата на гражданите трябва да се бранят от държавите. Например в САЩ съществуват т.нар. &#8222;do not call list (DNCL)&#8220; списъци, които дават законово право дори да съдите компании, които се опитват да рекламират продукти по телефона. Рекламните обаждания обаче са трудно доказуеми и все още в тази сфера има много законодателна работа.</p>
<p>Съвсем леко ще засегна т.нар. SEO (search engine optimization) спам (spamdexing). Истината е, че това не само е доходоносен бизнес, но вече се превърна и в професия. Наистина има много хора, които вече гордо се наричат &#8222;SEO експерти&#8220;, които вкарват скрити фрази в страниците на сайтове, пускат връзки към страници извън контекста на темите по чужди сайтове, правят т.нар. &#8222;google bombing&#8220;, само и единствено, за да успеят да &#8222;индексират&#8220; страниците си/за които работят по-напред в търсачките. Тук въпросът за разграничаване между стандартно оптимизиране на страница за по-добра позиция и spamdexing на страница е доста трудно. На практика &#8222;SEO&#8220; и &#8222;SEO спам&#8220; са едни и същи подходи &#8211; разликата се състои само в това дали страницата, която се &#8222;промотира&#8220; е свързана с ключовите думи или не.</p>
<p>В настоящата статия обаче ще се фокусираме основно върху най-популярния спам &#8211; този предаван по електронната поща. Есествено трябва да започнем от фундаментите на проблема &#8211; защо въобще ни пускат тези съобщения? Та нали те дразнят, та нали винаги ги изтриваме &#8211; какво се печели от това? Истината е, че от спам се печели!</p>
<p><strong>II. Защо има спам?</strong></p>
<p>Можете ли да си представите множеството от хора, които използват електронна поща? В днешния свят те са всякакви, от всички социални класи. Каквито хора има в обществото &#8211; такива има и в интернет. В развитите държави вече почти всеки използва интернет, затова можем да приемем, че дори множеството на всички хора скоро ще съвпада с множеството на интернет потребителите, а от там и множеството на хората имащи досег с електронна поща. Сега се замислете за хората, които виждате в обществото около вас. Има умни, глупави, богати, бедни, хитри, наивни, предприемчиви, загубени &#8211; в общи линии &#8222;за всеки влак си има пътници&#8220;. Е, точно така е и със спам! И за него &#8222;си има пътници&#8220;. Ако един от всеки хиляда потребителя повярва на съобщението, то това би било доста добра печалба. А ако смятате, че един на хиляда е прекалено малко, то нека да разгледаме статистиката на Cisco Systems за <a href="http://idgnow.uol.com.br/seguranca/2009/12/08/brasil-assume-a-lideranca-do-spam-mundial-em-2009-diz-cisco/" target="_blank">топ 10 държави за 2009, от които идва смам</a> (мерната единица е &#8222;трилиони съобщения за година&#8220;):</p>
<ol>
<li>Бразилия: 7.7;</li>
<li>САЩ: 6.6;</li>
<li>Индия: 3.6;</li>
<li>Южна Корея: 3.1;</li>
<li>Турция: 2.6;</li>
<li>Виетнам: 2.5;</li>
<li>Китай: 2.4;</li>
<li>Полша: 2.4;</li>
<li>Русия: 2.3;</li>
<li>Аржентина: 1.5.</li>
</ol>
<p>Надявам се, че успях да ви убедя, че &#8222;спам&#8220; е проблем, който изисква специално внимание. Всъщност този бизнес е достатъчно печеливш, за да съществува и вътрешен &#8222;черен пазар&#8220; между &#8222;спамерите&#8220;. Има търговия на e-mail адреси. Още повече &#8211; има търговия с профилирани e-mail адреси, като се продават списъци с потенциални клиенти в дадена сфера. Не рядко това се прави и от реномирани и известни компании, но естествено се осъществява &#8222;под масата&#8220; в нарушение на тяхната &#8222;privacy policy&#8220;. Никога ли не сте си задавали въпроса защо при регистрация за дадена услуга ви анкетират за рождена дата, адрес на местоживеене, професия, хоби и други подобни неща, които по принцип нямат никаква връзка с услугата, която ще ползвате? Естествено другите банални начини да се сдобият с вашия e-mail адрес са намирането му от уеб сайт, социална мрежа, налучкване и др.</p>
<p><strong>III. Кой изпраща спам?</strong></p>
<p>Сега да разгледаме въпроса &#8222;как се изпраща спам&#8220;. Обикновено &#8222;спамерите&#8220; не желаят да оставят следи кои са и не желаят да бъдат проследени. Това им помага при евентуално съдебно преследване, защото въпреки, че рекламират конкретна (неанонимна) услуга фактът, че изпращачът на съобщенията в нарушение е анонимен ги защитава доста умело (може конкурентна фирма да изпраща от ваше име и така да ви &#8222;злепоставя&#8220;, нали?). Затова обикновено &#8222;спамерите&#8220; целят да са анонимни. Затова спам се изпраща най-често по следния начин:</p>
<ol>
<li>През т.нар. &#8222;open mail relays&#8220; &#8211; обикновено начинаещи администратори на малки сървъри не знаят как да ги конфигурират и оставят своите SMTP сървъри да приемат заявки от всекиго, дори неавтентикирани потребители. Този проблем е наследство от първоначалния дизайн на електронната поща от зората на интернет. Въпреки, че проблемът с изпращането на спам от open mail relays е известен още от средата на 1990г., все още не е разрешен напълно. Обикновено сървър с open mail relay бива засечен и блокиран от своя доставчик (provider) бързо, но все пак през времето си на активност той изпраща огромно количество съобщения;</li>
<li>Чрез инфектирани с вирус потребителски машини &#8211; всеки компютър с достъп до интернет е потенциален SMTP сървър, който може да изпраща поща. Не са малко вирусите, които правят именно това &#8211; превръщат нищо неподозиращ потребител в &#8222;спамър&#8220;;</li>
<li>Лошо написани интернет приложения &#8211; често можете да видите форми за контакти на уеб сайтове, които биват използвани за спам. Наистина при тях човекът, който получава спам е един (получателя от формата за контакт). Тук обаче не трябва да ограничаваме множеството само до такива форми. Има форуми и социални мрежи, които позволяват на потребителите си да изпращат съобщения един на друг &#8211; те също могат да бъдат експлоатирани за спам. Тук не става въпрос само за електронна поща &#8211; дори т.нар. &#8222;лични съобщения&#8220; във форумите са уязвими от &#8222;спам ботове&#8220;. Спам в коментари или постинги също;</li>
<li>Доставчици на интернет &#8211; на пръв поглед звучи странно, но всъщност е разпространена практика. Често т.нар. &#8222;провайдъри&#8220; получават пари и допускат огромно количество спам, като когато получат оплакване, то се извиняват, че е уж от &#8222;техен потребител&#8220;. Така де, толкова ли е трудно на провайдъра да инсталира софтуер за мониторинг на трафика и като забележи, че негов потребител е изпратил над 100 e-mail съобщения за една минута, то да го блокира моментално? Изглежда, че е трудно, защото &#8222;техни клиенти&#8220; успяват да изпратят милиони съобщения&#8230; Обикновено в почивните дни (като оправдание за доставчика).</li>
</ol>
<p><strong>IV. Законова рамка за борба със спам</strong></p>
<p>Тъй като &#8222;спам&#8220; е вид бизнес, то независимо, че почти навсякъде се счита за нелегален, той няма да може да бъде спрян напълно. Това обаче не означава, че трябва да се примирим с него! Има два вида борба със спам &#8211; законова и технологична. По света, но най-вече в САЩ, има примери за съдебни дела срещу &#8222;спамери&#8220;, но опитите в тази посока все още са плахи. Колкото до България &#8211; ние можем да се &#8222;похвалим&#8220;, че сме първата и засега единствена държава, която легализира и узакони изпращането на спам. Вече често ще можете да видите писма, които съдържат текста &#8222;съгласно Закона за Електронна Търговия Ви съобщаваме, че съдържанието на този e-mail е непоискано търговско съобщение&#8220;. Ако получите &#8222;нежелано съобщение&#8220; и то не включва този текст, то бихте могли да предявите съдебен иск. Истината е, че тази &#8222;битка&#8220; засега е обречена на провал. Понякога е трудно да се докаже кой е изпратил съобщението и трудно се доказва, че съобщението е било &#8222;нежелано&#8220;. Е, не можем да не отречем, че тази законова мярка на българското правителство имаше и един много положителен ефект &#8211; в черният списък на спам филтрите на хората вече масово присъства фразата &#8222;непоискано търговско съобщение&#8220;. Честно казано засега тази мярка помага доста &#8211; възможно е това да се окаже правилен подход в крайна сметка.</p>
<p><strong>V. Технология за борба със спам при получателя<br />
</strong></p>
<p>Технологичната борба със спам засега е на три софтуерни нива &#8211; на интернет доставчиците, през които се изпраща поща, на сървърите получаващи пощата и накрая при крайния потребител. В началото се слагаха т.нар. &#8222;филтри&#8220; само на машините на крайния потребител, т.е. доставчиците на електронна поща дават целия трафик на потребителя и го оставят да се справи сам с нежеланата част от него. Това е логично с оглед на това, че всеки потребител трябва да отговаря сам за действията си в случай, че изтрие някое валидно съобщение. С огромното нарастване на трафика на нежелана електронна поща, както и поради незнанието как да се справят с проблема от страна на потребителите, с времето се наложи да се слагат филтри директно върху сървърите получаващи електронна поща. С бързото навлизане на уеб-базирани приложения за електронна поща (gmail, yahoo, abv и т.н.) този вид филтриране (от сървъра) стана основен и почти извзе всички функции по защитата от спам.</p>
<p>Досега има няколко основни подхода за &#8222;филтриране&#8220; на електронна поща що се отнася до сървърите получаващи поща и крайните потребители:</p>
<ol>
<li>Черни списъци &#8211; след получаване на нежелано съобщение потребителят добавя e-mail адреса, IP адреса или други характеристики на това съобщение в &#8222;черен списък&#8220;. Когато се получи втори път подобно съобщение, което отговаря на такъв критерий, то не се доставя до потребителя. Обикновено тези черни списъци са изцяло под контрола на крайния потребител. Изключение се получава когато спамър прави целенасочена атака към конкретен сървър и неговите потребители &#8211; тогава администраторът може да защити всичките си потребители с &#8222;глобален черен списък&#8220;;</li>
<li>Бели списъци &#8211; това е рядко използван подход, при който се разрешава получаване на поща от конкретен списък с адреси и блокиране на всички останали. Този разрешителен режим е много ефикасен, но приложим само в малко случаи при фиксирана служебна кореспонденция. Отново отговорността за тези филтри е изцяло върху крайния потребител;</li>
<li>Ключови думи &#8211; въвежда се списък със забранени думи и фрази в клиентското приложение. Така например беше споменато за блокирането на фразата &#8222;непоискано търговско съобщение&#8220; с цел защита срещу &#8222;легитимния български спам&#8220;;</li>
<li>DNS Block Lists &#8211; това е защита, която се конфигурира предимно на ниво &#8222;сървър&#8220;. Тактиката е да се блокира трафик от &#8222;известни източници на спам&#8220;. Както подсказва името, обикновено се блокират конкретни IP адреси и мрежи. Проблем с този вид филтриране е, че често се блокират цели доставчици и по този начин и техните легитимни потребители. Все пак в днешно време това се счита за най-добрия подход за справяне на масовия спам, т.е. този изпращан в огромни размери;</li>
<li>Bayesian филтри &#8211; това е статистически метод за категоризиране на съобщенията. Обикновено се използват две категории &#8211; &#8222;спам&#8220; и &#8222;валиден&#8220;, но понякога и категория &#8222;съмнителен&#8220;. Идеята на този метод е в събирането на информация от потребителите &#8211; обикновено в e-mail приложенията има бутон за отбелязване на дадено съобщение като &#8222;спам&#8220; и така се събира характеристична информация за разпознаване на бъдещи съобщения като спам. Освен информация подадена от потребителите се взимат в предвид и други типични характеристики на спам съобщенията &#8211; голямо наличие на връзки и html код, наличието на характерни ключови думи (viagra, sex, buy now, on sale, promotion и др.). Всички характеристики и статистически натрупана информация формират т.нар. &#8222;spam score&#8220; &#8211; число, което оценява съобщението по дадена скала. От тук насетне спрямо &#8222;нивото на защита&#8220;, избрано от потребителя, се прави филтриране и съобщенията с &#8222;spam score&#8220; над определен праг биват класифицирани като &#8222;спам&#8220;;</li>
<li>Изпитание и отговор &#8211; това е малко популярен метод при комуникацията с електронна поща, но е силно популярен при формите за изпращане на поща по сайтове, книгите за гости и анонимните коментари в блогове и сайтове. Особено популярен пример е captcha. В т.нар. Instant Messengers (IM) обикновено се поддържа разрешителен режим (бял списък), като при първоначално получаване на съобщение от неизвестен подател се задава въпрос към изпращача на съобщението. При правилен отговор изпращача се добавя към белия списък. Този метод е добър само тогава, когато въпросът е уникален &#8211; в противен случай &#8222;ботовете&#8220; се &#8222;научават&#8220; и лесно прескачат системата. Колкото до електронната поща този метод на защита не е много популярен, но е наличен. Обикновено се използват т.нар. &#8222;Ham Passwords&#8220; &#8211; когато изпратите съобщение то се &#8222;задържа&#8220;, а сървъра автоматично изпраща обратно отговор със съобщение, че оригиналното писмо е блокирано. Обикновено от потребителят се изисква да копира някакъв текст (парола) и да я върне като отговор по определен начин (обикновено в subject), за да отблокира съобщението си и то да бъде доставено до получателя. Понякога това се осъществява и с отиване на уеб сайт и извършване на потвърждение за доставка на съобщението (например с captcha). Този метод не е много популярен при електронната поща, защото значително затруднява изпращачите на съобщения;</li>
<li>Graylisting &#8211; преведено това са &#8222;сиви списъци&#8220;. Те винаги се конфигурират на ниво &#8222;сървър&#8220; и клиентските приложения нямат отношение към тях. Чудили ли сте се защо понякога като изпратите писмо до свой приятел, то идва при него след известно закъснение? Това определено в днешни дни рядко се дължи на &#8222;бавен интернет трафик&#8220; или &#8222;пренатоварен сървър&#8220;, а по-скоро именно на тези антиспам филтри. Защитата се състои в това, че сървъра временно &#8222;отхвърля&#8220; съобщения, получени от неизвестен подател. Един легитимен и работещ по стандартите SMTP сървър би трябвало да повтори опита за доставка на това отхвърлено съобщение след определен период от време (обикновено няколко минути). Обикновено при втори или трети опит получаващия сървър приема изпращача за валиден и го добавя в &#8222;бял списък&#8220;. Разчита се, че обикновено &#8222;спамърите&#8220; не правят повторение на опита си за доставка на съобщението. Колкото по-популярен става този метод обаче, толкова по-безсмислен е той, тъй като &#8222;спамърите&#8220; се научават да изпращат пощата си по стандартите. Очаква се в един момент той да се обезсмисли;</li>
<li>SMTP tarpitting &#8211; в духа на идеята за greylisting, tarpitting се използва за забавяне на комуникацията между сървъри. Идеята е връзката да се забави възможно най-дълго. Оригинално това решава редица проблеми, като например brute force атаки, но също така умело редуцира количеството спам. Наистина е значително по-трудно на спамърите да доставят десетки хиляди съобщения, при положение, че това ще им отнеме много дълго време;</li>
<li>Quit detection &#8211; по стандарт SMTP протокола изисква всяка връзка да бъде затваряна. Често спамърите просто изпращат информацията и оставят връзките в отворено състояние. Такива съобщения могат да бъдат блокирани;</li>
<li>Sender Policy Framework &#8211; т.нар. <a href="http://www.openspf.org/" target="_blank">SPF записи</a> са едно доста модерно обновяване на стандартите за комуникация по електронна поща, което впрочем се оказа, че се справя доста добре и с голямо количество спам. По принцип SPF се справя с друг вид проблем &#8211; т.нар. &#8222;spoofing&#8220; на e-mail адреси. Нормален SMTP сървър е конфигуриран така, че всеки автентикиран към него потребител може да изпрати поща от какъвто си иска e-mail адрес. С други думи чрез такъв SMTP сървър вие можете съвсем лесно да изпратите съобщение например от bill@microsoft.com. SPF е защита на две нива &#8211; на първо място самия домейн (microsoft.com от примера) трябва да добави т.нар. TXT запис, в който да укаже кои са хостовете/IP адресите, които имат право да изпращат поща от негово име. Също така получаващия сървър трябва да бъде конфигуриран така, че при получаване на съобщение да провери този списък и ако получава съобщение от непозволен хост, то да не го допусне до пощата на клиента. В днешно време SPF получава изключително широка популярност и повечето сериозни mail сървъри са конфигурирани така, че да го използват. Ако вие използвате електронна поща и често ви се случва да получавате т.нар. bounceback съобщения от адреси, на които вие никога не сте изпращали e-mail, то най-вероятно някой спамър изпраща съобщения от ваше име, а вашия домейн няма SPF запис;</li>
<li>Checksum базирано филтриране &#8211; този метод е изключително прост, логичен и много често използван при големи сървъри приемащи електронна поща. Състои се в това, че обикновено спам съобщенията се изпращат едни и същи към всички потребители. Така на сървъра започваме на пазим за определено време хеш код на текста от всяко подадено съобщение. Когато към сървъра се подадат над определен брой еднакви съобщения (обикновено разумно голям, за да не бъдат блокирани валидни mail листи), то те спират да се доставят. Естествено изпращачите на спам вече са свикнали с това и вече изпращат своите съобщения с известни разлики (можете често да видите някакъв произволен и нелогичен текст някъде вътре в съобщенията). Така този вид филтриране е изправено пред още една тежка задача &#8211; да може да определя съществената от несъществената информация в едно съобщение;</li>
<li>Адреси-капани &#8211; обикновено подход на крайните потребители от даден домейн, които създават специален e-mail адрес с обикновено (например peter@domain.dom), който не се използва и не се промотира никъде в официална комуникация с клиенти. Тъй като се очаква, че никой легитимен потребител не би изпратил писмо до този адрес, то всяко получено съобщение на него влиза в &#8222;черен списък&#8220; за всички останали адреси от този домейн. Този метод не е особено ефективен, защото се справя единствено със спамърите, които изпращат безразборно поща от тип &#8222;налучкване на адреси&#8220;. Това е стар и неефективен подход за изпращане на спам към малки домейни &#8211; той работи само върху домейни с много e-mail адреси (а при тях възможността за грешка на легитимен изпращач се увеличава значително). Друга по-удачна тактика е за създаване отново на такъв адрес-капан и масовото му записване по известни mail листи на спамъри. По този начин можете да защитите работните си e-mail адреси от доста голямо количество еднотипен търговски спам (но не и от всеки);</li>
<li>Spamming the spammers &#8211; все още непопулярен и спорен метод за борба със спам. Основава се на това при получаването на всяко съобщение да се прави обратна връзка до IP адреса на изпращача и &#8222;занимаването му&#8220; с определени дейности. Това може да е поредица от ping заявки например. Очакването е, че ако бъде масово имплементиран, то спам машината ще бъде задръстена от заявки и по този начин ще направи DoS атака сама на себе си. Така обаче често се засягат и нищо неподозиращите &#8222;zombie computers&#8220; &#8211; тези на инфектирани с вирус потребители;</li>
<li>Проверка на валидност на HELO/EHLO &#8211; въпреки, че не е по стандартите, понякога сървърите проверяват достоверността на HELO заявките към тях. Например те проверяват дали при заявка &#8222;HELO domain.dom&#8220; този домейн наистина отговаря на IP адреса, който я изпраща. По принцип стандартите казват, че просто този домейн трябва да отговаря (на ping), но не и на IP адреса на изпращача. Истината е, че много администратори на сървъри тъй или иначе не спазват стандартите (например забраняват ping към сървърите си поради някакви съображения за сигурност) и така с подобна проверка бихме блокирали и легитимни съобщения. Затова и такъв вид защита все още не е въведен масово &#8211; това може би ще стане тогава, когато бъде приет като стандарт (което пък ще доведе и до други специфични ограничения &#8211; затова въвеждането е спорно). Може да се направи и т.нар. PTR checking, т.е. проверка на reverse DNS записа на IP адреса на изпращача, но и в този случай положението е спорно. Все пак често се прилага проверка поне на MX записите на домейна &#8211; добре е като получавате поща от даден домейн, то този домейн да има mail сървър, на който да може да се отговаря. В противен случай състоянието му е много съмнително;</li>
<li>Open relay капани &#8211; това са сървъри в големи мрежи, които привидно приличат на open relays. Когато спамърите търсят такива сървъри със скенери, то те попадат на този сървър-капан и се опитват да изпратят поща чрез него. Така администраторите на тези мрежи ги блокират в DNSbl;</li>
<li>Потребителска статистика &#8211; понякога големите доставчици на електронна поща въвеждат статистически методи за вкусовете на потребителите си. Например ако забележат, че вие много често изтривате еднотипни съобщения идващи от един източник, без да ги четете, то е вероятно да преместят следващи съобщения автоматично в папка &#8222;спам&#8220; или &#8222;съмнителни съобщения&#8220;. Също така ако един потребител често маркира едни и същи съобщения като &#8222;спам&#8220;, но други потребители не го правят, то се въвежда филтър само за този конкретен потребител (явно той има личен проблем с изпращача на дадените писма).</li>
</ol>
<p><strong>VI. Технология за борба със спам при изпращача</strong></p>
<p>Естествено важна е и защита, която &#8222;добрите доставчици&#8220; и изпращачите на съобщения трябва да имплементират:</p>
<ol>
<li>Активно следене на потребителите във вашата компютърна мрежа и броя съобщения за определен период от време, които те изпращат. Логично е нормален потребител във вашата мрежа да не трябва да изпраща хиляди съобщения;</li>
<li>Потвърждение за услуга &#8211; има много честни фирми (неспамъри), които позволяват на потребителите да се записват към техни т.нар. newsletters или mailing lists. Не е рядкост злонамерена атака към такива фирми, която записва масово e-mail адреси на неподозиращи трети страни. Така тези записани потребители получават съобщенията на фирмата и логично ги класифицират като &#8222;спам&#8220; и така дескридитират името й в DNSbl листите (може да се достигне до неприятни последствия за самата фирма и това не е рядкост). Затова винаги имплементирайте система за &#8222;потвърждение&#8220; на записването. Това обикновено е първоначално изпращане на e-mail с текст &#8222;получихме заявка за записване към нашата услуга X &#8211; натиснете на този -&gt; линк &lt;- за да потвърдите записването&#8220;. Освен това никога не изпращайте подобен e-mail за потвърждение до един и същи е-mail адрес два или повече пъти &#8211; рискувате от друг вид flood атака;</li>
<li>Следене на нови акаунти в системата на hosting и internet service providers &#8211; обикновено спамърите не са стари и утвърдени потребители. Най-често те са многократно изхвърляни от различни мрежи и регистрират винаги нови и нови акаунти. Затова новите потребители трябва да бъдат следени за известно време;</li>
<li>Филтриране на изходящата поща &#8211; някои от сървърните филтри могат да се прилагат към изходящата поща от вашия сървър/мрежа &#8211; например Bayesian или филтри по ключови думи/фрази;</li>
<li>Отказване за доставка на backscatters &#8211; вече намекнахме за проблема за т.нар. e-mail forgery, когато описвахме SPF записите. Добре е вашия e-mail сървър да не доставя bounceback известия за съобщения, които вие никога не сте изпращали. Дори вие да имате коректни TXT записи за SPF record &#8211; все още има много сървъри, които не го поддържат и те могат да връщат bounceback на forged e-mails. Това би могло да се използва включително за flood срещу вас;</li>
<li>Блокиране на порт 25 &#8211; малко остарял метод, но все пак доставчиците на интернет понякога с цел на защита от ботове блокират порт 25 и дават на потребителите си друг порт за изпращане на поща (обикновено 587). В общи линии това води до повече затруднения отколкото ползи.</li>
</ol>
<p><strong>VII. Заключение</strong></p>
<p>Накрая искаме да дадем няколко съвета за това как да намалите чисто практично количеството спам във вашата поща. На първо място &#8211; не купувайте нищо от случайни писма попаднали във ващата електронна поща! Не им отговаряйте и се правете пред тях, че не съществувате! Не си давайте e-mail-а &#8222;под път и над път&#8220;! Когато се регистрирате за някакви временни, краткосрочни или непознати услуги си направете временен нов e-mail адрес, който след изтичане на услугата го закривайте. Пишете на доставчика на спамърите! Пишете до DNSbl листите когато получите спам. Използвайте &#8222;спам&#8220; бутона в е-mail клиентите си. Не на последно място &#8211; никога не маркирайте легитимна поща като &#8222;спам&#8220; &#8211; ако просто не желаете да получавате известия за услуга, която сте спряли да ползвате, то трябва да последвате процедурата за легитимно отписване. В противен случай (с блокиране и филтриране на тези e-mail-и) вие създавате проблеми на други потребители, които биха искали да получават въпросните писма.</p>
<p><strong>Използвани източници</strong>: Предимно личен опит и <a href="http://en.wikipedia.org/wiki/Anti-spam_techniques" target="_blank">Wikipedia</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/5458-antispam-fight/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Honeypot captcha</title>
		<link>http://www.cphpvb.net/network-security/3352-honeypot-captcha/</link>
		<comments>http://www.cphpvb.net/network-security/3352-honeypot-captcha/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 19:10:13 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=3352</guid>
		<description><![CDATA[Напоследък в блоговете се наблюдава сериозна битка за територия между две технологии &#8211; askimet и captcha. Askimet не е нова и кой знае колко иновативна технически технология &#8211; събира статистики от стотици хиляди сайтове и на базата на тях преценява кой коментар в блог е спам и кой не. Така например действа и филтърът за [...]]]></description>
			<content:encoded><![CDATA[<p>Напоследък в блоговете се наблюдава сериозна битка за територия между две технологии &#8211; askimet и captcha. <a href="http://akismet.com/" target="_blank">Askimet</a> не е нова и кой знае колко иновативна технически технология &#8211; събира статистики от стотици хиляди сайтове и на базата на тях преценява кой коментар в блог е спам и кой не. Така например действа и филтърът за Outlook &#8211; <a href="http://spambayes.sourceforge.net/" target="_blank">SpamBayes</a>. На другия фронт стои captcha &#8211; технология, за която вече писах в предишна статия. Тя не се позовава на никакви статистики &#8211; тя разчита на чисто технологично решение на проблема.<span id="more-3352"></span></p>
<p>Наскоро прочетох малко <a href="http://www.seomoz.org/blog/captchas-affect-on-conversion-rates" target="_blank">статистики за captcha</a> и нейния ефект върху бизнеса. Според това скромно социологическо проучване има вероятност да изгубите около 3.2% от реалните коментари при използването на Captcha срещу алтернативният метод. Тук веднага бих дал и формулата според която да изчислим &#8222;дали да използваме Captcha или пък друга услуга като Askimet&#8220;. Когато стартирате подобен бизнес трябва да прецените кое от двете е с по-голяма икономическа тежест за вас:</p>
<ul>
<li>Загубата на 3.2% потенциални клиенти &#8211; captcha;</li>
<li>Загубата на пари при даване на заплата (или закупуване на платена услуга) за модериране на изпуснат spam и &#8222;false positive&#8220; коментари.</li>
</ul>
<p>Моето скромно мнение казва, че всичко зависи от големината на бизнеса. Колкото по-големи са печалбите и се увеличава трафика &#8211; толкова повече captcha губи смисъл. С други думи един естествен ход на един бизнес ориентиран блог би тръгнал от ръчно модериране от собственика и използване на филтри (това е моментът, в който блогът не е много популярен и все още не се радва на сериозен интерес &#8211; като моя например), през слагане на captcha (когато собственика на блога започне да изпитва затруднение в модерирането на коментарите), до премахване на captcha и връщане към филтри с платен персонал за контрол (когато приходите са достатъчни, за да бъде оправдана такава заплата).</p>
<p>Междувременно през страницата със статистиките попаднах на много интересна идея, която впрочем не е кой знае колко нова &#8211; <a href="http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx" target="_blank">honeypot captcha</a>. Накратко идеята е да вкарате допълнително поле във вашите HTML форми, което обаче е скрито чрез използване на CSS. По този начин ботовете биха попълнили това поле с някаква информация, докато потребителите &#8211; не (понеже не го виждат).</p>
<p>Смятам тази стратегия за изключително добра при използването на популярен софтуер. Ако например използвате WordPress, то спокойно можете да го приложите към коментарите на блога си, като например направите някое от стандартните полета (например &#8222;website&#8220;) скрито с honeypot captcha. Естествено е нужно да бъдете уникални в конкретната реализация.</p>
<p>Когато става дума за частен продукт обаче тази техника не е приложима. Простата причина е, че ботовете тъй или иначе не знаят структурата на системата ви за коментари/заявки. При частните продукти винаги спам атаките са съставени ръчно, тоест атакуващия няма да се &#8222;хване в капана&#8220;.</p>
<p>Все пак &#8222;honeypot catpcha&#8220; (което всъщност няма нищо общо с captcha) заслужава нашето внимание. Бих препоръчал тази техника на програмистите на средноголями и голями популярни сайтове използващи стандартни платформи.</p>
<p>П.П. В статията говорих главно за &#8222;блогове&#8220; като най-засегнати от спам софтуерни продукти, но всичко казано тук е валидно за всички видове софтуер.</p>
<p>П.П.2. Приятел разшири темата като предложи дори &#8222;скрита captcha&#8220;. Това според мен е спорен елемент. Не съм съвсем сигурен, че ботовете са чак толкова напреднали, че да търсят уязвимости в нестандартни форми. По-склонен съм да мисля, че ботовете атакуват само стандартен софтуер. Да, на такъв бихте могли да скритете стандартната captcha :)</p>
<p><strong>Задача</strong>: Реализирайте HTML форма с HoneyPot captcha чрез използване на CSS, JavaScript или друга функционалност.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/3352-honeypot-captcha/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ATM карти с чип</title>
		<link>http://www.cphpvb.net/network-security/2012-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8-%d1%81-%d1%87%d0%b8%d0%bf/</link>
		<comments>http://www.cphpvb.net/network-security/2012-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8-%d1%81-%d1%87%d0%b8%d0%bf/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 12:26:19 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=2012</guid>
		<description><![CDATA[ATM картите с чип, по-добре познати като EMV (съкратено от Eurocard, Mastercard и Visa), е стандарт създаден през 1995г., който тепърва се налага масово по света. При тях също се използват различни алгоритми за криптиране на информацията - DES, Triple-DES, RSA или SHA. Най-главното предимство пред стандартните карти с магнитна лента е това, че много по-трудно [...]]]></description>
			<content:encoded><![CDATA[<p>ATM картите с чип, по-добре познати като EMV (съкратено от Eurocard, Mastercard и Visa), е стандарт създаден през 1995г., който тепърва се налага масово по света. При тях също се използват различни алгоритми за криптиране на информацията - DES, Triple-DES, RSA или SHA. Най-главното предимство пред стандартните карти с магнитна лента е това, че много по-трудно се копира самата информация от чипа.<span id="more-2012"></span></p>
<p>Най-грубо казано картите с чип имат предимството да бъдат четени доста по-трудно. Когато поставите картата в устройство, тя трябва да бъде поставена абсолютно точно под четеца. Освен това е нужно технологично време за захранване и предаване на информацията &#8211; това забавя процеса, но го прави и по-сигурен. Така изключително много се затруднява използването на ATM skimmers. При банкоматните системи бих казал, че става почти невъзможно използването на допълнителни устройства.</p>
<p>EMV стандарта естествено има и редица други преимущества, но главния поглед остава върху сигурността. Тенденцията в бъдеще е всички банкови карти да преминат на този стандарт и магнитната лента да остане в миналото. За съжаление в момента картите с чип обикновено се правят комбинирани &#8211; едновременно чип и магнитна лента. Това е така, защото се търси обратна съвместимост със стари банкомати. По този начин предимствата на чипа, от гледна точка на сигурността, на практика липсват напълно.</p>
<p>ATM картите с чип не решават всички проблеми. Атаката с използване на фалшиви устройства, за която споменах в първата статия от серията, е напълно действаща и при картите с чип. Това за съжаление въобще не е малко звено от измамите с кражба на банкови карти.</p>
<p>Тук е момента да спомена, че с навлизането на банкови карти с чип се забелязва една друга тенденция на банките &#8211; самия PIN код да не бъде съхраняван на самата ATM карта.  На нея се пази единствено информация за номера на сметката на притежателя. Това е колкото полезно, толкова и опасно. От една страна ако откраднат вашата карта вие сте убеден, че PIN кода ви няма да е известен на престъпниците. От друга страна базата данни с PIN кодове се съхранява при банката и по този начин евентуална кражба на такава база може да доведе до фатални за банката последици. Така има възможност (чрез множество допълнителни условия естествено) крадците  сами да си генерират банковите карти без въобще да се налага копиране на оригиналната!</p>
<p>Теоретично съм разглеждал възможността кодирания PIN код да се раздели на две части. Едната част да се съхранява на картата, а другата част &#8211; в базата данни на банката. Това не решава проблема напълно (ако крадците имат едновременно банковата карта и копие на базата на сървъра на банката, то те имат всичко), но все пак утежнява нещата значително.</p>
<p>Другата ми идея (едва ли е революционна, но поне не намерих подобна информация в интернет) е за &#8222;ATM Flash&#8220; карти. Идеята е при всяко успешно автентикиране на легитимен банкомат, банката да генерира нов master key за вашата карта и да записва обновен криптиран PIN код на нея. По този начин копието, с което разполагат крадците ще бъде валидно за ограничено време, т.е. ние сериозно ги затрудняваме в процеса на производтво на копие на вашата банкова карта.</p>
<p>Процеса на защита на плащанията е пропорционален на триковете, които крадците намират, за да извършват измами. Сигурен съм, че картите с чип и предложените от мен методи за защита не са най-доброто, което може да се измисли. В тази сфера има още много да се работи.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/2012-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8-%d1%81-%d1%87%d0%b8%d0%bf/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Разбиване на PIN код</title>
		<link>http://www.cphpvb.net/network-security/2006-%d1%80%d0%b0%d0%b7%d0%b1%d0%b8%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-pin-%d0%ba%d0%be%d0%b4/</link>
		<comments>http://www.cphpvb.net/network-security/2006-%d1%80%d0%b0%d0%b7%d0%b1%d0%b8%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-pin-%d0%ba%d0%be%d0%b4/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 10:28:17 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=2006</guid>
		<description><![CDATA[Personal Identification Number (PIN) кодът е измислен като метод за автентикация през 1967г от Джон Шепърд-Барон. По-късно е стандартизиран по ISO 9564-1, където се дефинира, че PIN код трябва да бъде поредица от 4 до 12 цифри. При ATM картите най-често се използва 4 цифрен PIN код. Така възможните комбинации са общо 10 000 &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Personal Identification Number (PIN) кодът е измислен като метод за автентикация през 1967г от Джон Шепърд-Барон. По-късно е стандартизиран по ISO 9564-1, където се дефинира, че PIN код трябва да бъде поредица от 4 до 12 цифри.</p>
<p>При ATM картите най-често се използва 4 цифрен PIN код. Така възможните комбинации са общо 10 000 &#8211; от 0000 до 9999. Повечето банкови системи дават право на до три грешни опита за въвеждане на PIN код, след което блокират картата. По този начин опитите за &#8222;налучкване&#8220; са сведени до вероятност от 0.3%.<span id="more-2006"></span></p>
<p>PIN кода на масово използваните ATM карти се &#8222;складира&#8220; на магнитната лента. Той е криптиран с ключ, който се пази от банката, издала картата. Отделно от това преди криптирането на кода, той се превръща в шеснадесетичен формат (цифри от 0-9 и букви A-F). За декриптирането му по-късно се използва т.нар. &#8222;decimalization&#8220; таблица, която превръща криптирания код от шестнадесетичен в десетичен (например като превърне A в 0, B в 1 и т.н.).</p>
<p>Когато поставите картата си в банкомат първоначално избирате сума, която искате да изтеглите. След това от вас се иска да въведете PIN код. След като въведете PIN кода си, той заедно с кодирания код на банковата карта се изпрачща към ATM Controller до т.нар. Hardware Security Module (HSM). Той дешифрира подадения низ, след което чрез decimalization таблицата той дешифрира шестнадесетичния код. Така полученото число се сверява с въведеното от клавиатурата на банкомата. След това се изпраща отговор до банкомата дали въведения код е верен или не. Трябва да се отбележи, че важен елемент в този модел на сигурност е, че практически никой не знае вашия PIN код &#8211; дори хората в самата банка, тъй като той се складира само и единствено на вашата банкова карта.</p>
<p>Първият сериозен пробив в сигурността на банкоматната система е открит през 2002г. Той е свързан с широко използвани и до днес HSM системи на IBM. Пробивът в сигурността се осъществява от вътрешен за банката човек, който има достъп до ATM контролера. Той подменя &#8222;decimalization&#8220; таблицата, която се подава към HSM контролера и по този начин значително намалява броя нужни опити за налучкване на PIN код. Този метод повишава вероятността за налучкване на PIN код до 6.6%. Виждате, че това е 660 пъти по-голяма вероятност от стандартната. За щастие продължава да е достатъчно малка за реална атака и не предизвиква сериозни проблеми в сигурността на банковите системи.</p>
<p>Проблеми с ATM конролера за сигурност обаче все пак има и то изключително сериозен. Когато вътрешен служител на банката има достъп до HSM контролера, то той има възможност да открадне ключа за декриптиране на кодовете, подавани от картите. Така когато бъде открадната банкова карта на същата банка, то крадците могат да си съставят таблица от вече криптирани ключове и да сравняват с този, който са откраднали. Такава таблица се състои от комбинациите между всички възможни decimalization таблици и 10000 възможни PIN кода. За съвременната компютърна техника това не е проблем.</p>
<p>Популярни са и други видове вътрешни за банката атаки, които чрез допълнителен софтуер прочитат PIN кода от RAM паметта на ATM контролера, в момента в който е в декриптиран вид. Затова в банковата система достъп до ATM контролерите се получава под изключително строг режим.</p>
<p>По-обиграните атаки работят с разбиване на кодовете без достъп до банковата система. Един пример е с подмяната на данни. Според стандартите PIN кода освен криптиран с т.нар. &#8222;master key&#8220;, той трябва да се криптира допълнително и при &#8222;транзит&#8220; (тоест при преминаване между различни устройства) &#8211; това често се налага, когато например използвате банкомат на друга банка. Именно чрез добавяне на такава допълнителна транзитна точка или имащи достъп до такава атакуващите имат възможност да използват множество открити уязвимости в HSM устройствата.</p>
<p>Такива уязвимости за съжаление има много, тъй като банкоматите са длъжни да работят и с по-стари стандарти за банкови карти. Също така те трябва да работят и с банки от други държави, които може да поддържат остарели стандарти. Има доказани случаи при които чрез външно устройство е била открадвана важна информация за master key на банката, която издава картата. Такива уязвимости се премахват постепенно чрез обновяване на банковите системи, но за съжаление все още са налице. Конкретен пример за сериозността на този проблем е залавянето на 11 хакера миналата година, които са обвинени в кражбата на над 40 милиона криптирани ключа от TJ Maxx и други подобни мрежи в САЩ.</p>
<p>Атаките с конкретно налучкване на master key като че ли са в миналото, когато алгоритмите за криптиране са били слаби. Въпреки това такива атаки са напълно реална заплаха, тъй като често се използват масивни botnets за търсене на такива ключове. Банките от своя страна не са в състояние да подменят своите ключове често, защото е нужно да подменят огромно количество ATM карти.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/2006-%d1%80%d0%b0%d0%b7%d0%b1%d0%b8%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-pin-%d0%ba%d0%be%d0%b4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ATM карти &#8211; 2</title>
		<link>http://www.cphpvb.net/network-security/2002-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8-2/</link>
		<comments>http://www.cphpvb.net/network-security/2002-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8-2/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 08:51:11 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=2002</guid>
		<description><![CDATA[В настоящата статия ще дам малко факти относно кражбите на ATM карти. Информацията е по данни на Федералното Бюро за Разследване на САЩ, която беше представена на презентация във ФМИ на СУ преди няколко месеца: Общите загуби на САЩ от кибер престъпления (които в по-голямата си част включват именно кражба на ATM карти) е 1.5 [...]]]></description>
			<content:encoded><![CDATA[<p>В настоящата статия ще дам малко факти относно кражбите на ATM карти. Информацията е по данни на Федералното Бюро за Разследване на САЩ, която беше представена на презентация във ФМИ на СУ преди няколко месеца:<span id="more-2002"></span></p>
<ol>
<li> Общите загуби на САЩ от кибер престъпления (които в по-голямата си част включват именно кражба на ATM карти) е 1.5 милиарда долара за 2008г;</li>
<li>Оплакванията в &#8222;Internet Complaint Center (IC3)&#8220; са над 200 000 за година;</li>
<li>Най-масовата кражба е в диапазона от 100 до 1000 долара;</li>
<li>По-възрастните хора стават по-често жертви на кражба, но тенденцията е с времето процентите да се изравнят. Това се обяснява с фактът, че възрастните хора работят по-малко с електронни устройства и интернет;</li>
<li>Съотношението на измамени мъже и жени е 60:40;</li>
<li>В световен мащаб най-много киберпрестъпления има в САЩ. Тенденцията обаче е измамите в ЕС да се засилват;</li>
<li>Престъпниците обикновено са от източна Европа и най-вече Русия.</li>
</ol>
<p>Как работи една престъпна група? Досега разбитите групировки за кражба на ATM карти показват, че структурата им следва общата ни представа за мафия. Начело на групировките винаги има един човек, който се нарича шеф (boss). От долу следва доста строга структура, която включва програмисти, специалисти по пробиви в сигурността, брокери на лични данни, фалшификатори, &#8222;мулета&#8220; (хора, които теглят самите суми), &#8222;човешки ресурси&#8220; (хора набиращи &#8222;персонал&#8220; за престъпната схема), както и хора, които се грижат за сигурността вътре в организацията.</p>
<p>Интересно е, че мулетата взимат значителна част от парите &#8211; до 50%. Те обикновено са наркозависими или хора с финансови затруднения. Въпреки големите суми който получават, при тях рискът е най-голям. Разкриваемостта на &#8222;мулетата&#8220; е доста голяма. За съжаление полицията рядко успява да се свърже с хора &#8222;по-високо&#8220; в схемата.</p>
<p>Като един пример можем да дадем вече разбита руска организация за източване на дебитни карти, която през 2007г е направила опит за над 15 000 транзакции за 30 минути на стойност над 10 милиона долара, като от тях около 14 500 са били успешни. Общата сума на откраднатите пари е била 9.7 милиона долара. За удара са използвани над 2100 банкомата в 28 държави (общо в 49 града). Виждате, че измеренията на кражбите въобще не са малки.</p>
<p>Този пример е действал напълно по схемата описана в предишната статия. ATM Skimmers устройства са записали съдържанието на магнитната лента на ATM карти, PIN кода е бил записан или &#8222;разбит&#8220; (ще погледнем този въпрос по-късно) и в Русия са произведени копия на дебитните карти. Тези копия на карти са изпратени по мулета по цяла Европа и транзакциите са извършени едновременно, за да се създаде ефект на паника.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/2002-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ATM карти</title>
		<link>http://www.cphpvb.net/network-security/1944-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8/</link>
		<comments>http://www.cphpvb.net/network-security/1944-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 08:54:43 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=1944</guid>
		<description><![CDATA[ATM картите са по-добре познати в България като &#8222;карти за банкомат&#8220;. Те могат да бъдат дебитни или кредитни в зависимост от условията на договора ви с банката. Всички ATM карти поддържат международен стандарт ISO/IEC 7810 ID1, който дефинира размери от 85.60 × 53.98 милиметра. Този стандарт добавя и допълнителни характеристики като запалимост, токсичност и др. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">ATM картите са по-добре познати в България като &#8222;карти за банкомат&#8220;. Те могат да бъдат дебитни или кредитни в зависимост от условията на договора ви с банката. Всички ATM карти поддържат международен стандарт ISO/IEC 7810 ID1, който дефинира размери от  85.60 × 53.98 милиметра. Този стандарт добавя и допълнителни характеристики като запалимост, токсичност и др.</p>
<p style="text-align: left;">В тази статия ще пиша главно относно начините за кражба на ATM карти. На първо време трябва да спомена, че има две възможности за изтегляне на пари от банкова карта &#8211; online и offline:<span id="more-1944"></span></p>
<p style="text-align: left;">- Online тегленето на пари е най-познато &#8211; вкарвате дебитната си карта в устройство, което иска въвеждането на ваш секретен код (наречен PIN код). По този начин работят всички банкомати и повечето магазини. Предполагам, че повечето от вас са запознати с този метод на работа с ATM карти.</p>
<p style="text-align: left;">- Offline транзакциите дават възможност за изтегляне на пари от банкова карта без въвеждането на PIN код. Това може да стане както в магазин, така и по Интернет. Такива са картите VISA, Mastercard, American Express и др. За сигурността на транзакцията в самия магазин се разчита на записи от видео камери и директния контакт с продавача. За сигурността в Интернет обаче няма сериозна защита.</p>
<p style="text-align: left;">От гледна точка на сигурността offline транзакциите са изключително опасни. За осъществяване на транзакция чрез интернет дори не е нужно налично копие на самата карта &#8211; трябва единствено номера на картата и секретния трицифрен CVV код. Те за съжаление са отпечатани на самата пластика на картата. Използвайте такива карти само и единствено за пазаруване в Интернет и не ги носете за пазар в магазини, където евентуален мошеник може да добие физически достъп до вашата карта.</p>
<p style="text-align: left;">Колкото до online транзакциите &#8211; там измамниците са затруднени. Освен физическо копие на вашата карта, на тях им е нужен и вашия PIN код. Как може да се случи това? Ще дам няколко примера от т.нар. &#8222;ATM skimming&#8220; от банкомат. Снимките са взети от сайта на полицейското управление в Остин -  Тексас:</p>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1945" class="wp-caption aligncenter" style="width: 461px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-1945" title="Допълнително устройство" src="http://www.cphpvb.net/wp-content/uploads/2009/06/atm1.jpg" alt="Допълнително устройство" width="451" height="300" /></dt>
<dd class="wp-caption-dd">Допълнително устройство</dd>
</dl>
</div>
<p style="text-align: left;">На горната снимка виждате как изглежда оригиналния процеп на банкомата. Устройството, което записва информацията от ATM картата е изключително тънко и трудно забележимо.</p>
<p style="text-align: center;">
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1946" class="wp-caption aligncenter" style="width: 459px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-1946" title="Устройсвото в действие" src="http://www.cphpvb.net/wp-content/uploads/2009/06/atm2.jpg" alt="Устройсвото в действие" width="449" height="272" /></dt>
<dd class="wp-caption-dd">Устройсвото в действие</dd>
</dl>
</div>
<p style="text-align: left;">Виждате, че поставено на място то не подбужда сериозно съмнение. Нормален човек едва ли би забелязал, че има прикачено допълнително устройство.</p>
<p style="text-align: center;">
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1947" class="wp-caption aligncenter" style="width: 458px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-1947" title="Камера" src="http://www.cphpvb.net/wp-content/uploads/2009/06/atm3.jpg" alt="Камера" width="448" height="279" /></dt>
<dd class="wp-caption-dd">Камера</dd>
</dl>
</div>
<p style="text-align: left;">Краденето на вашия PIN код е трудно, понеже е технически трудно да се дублира клавиатурата на банкомата (но не невъзможно). Затова по-честата практика е да се поставят безжични камери, насочени към клавиатурата.</p>
<p style="text-align: center;">
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1948" class="wp-caption aligncenter" style="width: 453px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-1948" title="ATM skimming в действие" src="http://www.cphpvb.net/wp-content/uploads/2009/06/atm4.jpg" alt="ATM skimming в действие" width="443" height="304" /></dt>
<dd class="wp-caption-dd">ATM skimming в действие</dd>
</dl>
</div>
<p style="text-align: left;">Вие бихте ли се усъмнили в банкомата на горната снимка? В нормалния живот &#8211; по-скоро не. Истината е, че такива устройства се продават дори по интернет. Показаното по-горе е с &#8222;едри&#8220; размери (размер normal, като има small и дори slim с големина не много по-голяма от процепа за самата карта). Ето един друг пример от центъра за сигурност на <a href="http://consumerist.com/tag/commonwealth-bank/" target="_blank">Commonwealth bank</a>:</p>
<p style="text-align: center;">
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1959" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer.png"><img class="size-medium wp-image-1959" title="slim skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-300x226.png" alt="Устройството е изключително незабележимо" width="300" height="226" /></a></dt>
<dd class="wp-caption-dd">Устройството е изключително незабележимо</dd>
</dl>
</div>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1960" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer2.png"><img class="size-medium wp-image-1960" title="Slim atm skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer2-300x214.png" alt="Едва ли човек може да забележи това" width="300" height="214" /></a></dt>
<dd class="wp-caption-dd">Едва ли човек може да забележи това</dd>
</dl>
</div>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1961" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer3.png"><img class="size-medium wp-image-1961" title="ATM skimmer slim" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer3-300x166.png" alt="Включително може да се изреже дупка в самия банкомат!" width="300" height="166" /></a></dt>
<dd class="wp-caption-dd">Включително може да се изреже дупка в самия банкомат!</dd>
</dl>
</div>
<p style="text-align: center;">
<div id="attachment_1970" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer4.png"><img class="size-medium wp-image-1970" title="ATM skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer4-300x97.png" alt="Друг пример за ATM skimmer" width="300" height="97" /></a><p class="wp-caption-text">Друг пример за ATM skimmer</p></div>
<p style="text-align: left;">Колкото до заснемането и краденето на вашия PIN код &#8211; и тук има множество варианти:</p>
<p style="text-align: center;">
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1963" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/pincapture.png"><img class="size-medium wp-image-1963" title="PIN Capture" src="http://www.cphpvb.net/wp-content/uploads/2009/06/pincapture-300x181.png" alt="Има ли нещо съмнително тук?" width="300" height="181" /></a></dt>
<dd class="wp-caption-dd">Има ли нещо съмнително тук?</dd>
</dl>
</div>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1964" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/pincapture2.png"><img class="size-medium wp-image-1964" title="PIN Capture" src="http://www.cphpvb.net/wp-content/uploads/2009/06/pincapture2-300x176.png" alt="Това устройство е сложено допълнително" width="300" height="176" /></a></dt>
<dd class="wp-caption-dd">Това устройство е сложено допълнително</dd>
</dl>
</div>
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1965" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/pincapture3.png"><img class="size-medium wp-image-1965" title="PIN capture" src="http://www.cphpvb.net/wp-content/uploads/2009/06/pincapture3-300x177.png" alt="Ето какво има вътре в него" width="300" height="177" /></a></dt>
<dd class="wp-caption-dd">Ето какво има вътре в него</dd>
</dl>
</div>
<p style="text-align: left;">Ето и как изглежда устройство за прихващане на PIN код от клавиатурата:</p>
<p style="text-align: center;">
<div class="mceTemp mceIEcenter" style="text-align: center;">
<dl id="attachment_1967" class="wp-caption aligncenter" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/plate.png"><img class="size-medium wp-image-1967" title="PIN capture plate" src="http://www.cphpvb.net/wp-content/uploads/2009/06/plate-300x185.png" alt="Дублиращата клавиатура също е незабележима" width="300" height="185" /></a></dt>
<dd class="wp-caption-dd">Дублиращата клавиатура също е незабележима</dd>
</dl>
</div>
<p style="text-align: left;">Кражбата на карти чрез банкомати обаче е по-малкото перо на проблема. Почти всички банкомати вече са оборудвани с видео наблюдение и се проверяват редовно от служители на банката. Банкоматите обикновено се използват в последствие &#8211; когато крадецът има копие на вашата карта и знае вашия PIN код. Спорен остава въпроса обаче, когато самите служители на банката са замесени в престъпна схема. Ето още няколко снимки на типичен ATM skimmer:</p>
<p style="text-align: center;">
<div id="attachment_1974" class="wp-caption aligncenter" style="width: 235px"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/atm_fraud_10.jpg"><img class="size-medium wp-image-1974" title="ATM skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/atm_fraud_10-225x300.jpg" alt="Типичен банкомат приличащ на българските" width="225" height="300" /></a><p class="wp-caption-text">Типичен банкомат приличащ на българските</p></div>
<div id="attachment_1975" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/atm_fraud_09.jpg"><img class="size-medium wp-image-1975" title="ATM skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/atm_fraud_09-300x225.jpg" alt="Ето как се заснема вашия PIN код" width="300" height="225" /></a><p class="wp-caption-text">Ето как се заснема вашия PIN код</p></div>
<p style="text-align: center;">
<div id="attachment_1973" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/atm_fraud_08.jpg"><img class="size-medium wp-image-1973" title="ATM fraud" src="http://www.cphpvb.net/wp-content/uploads/2009/06/atm_fraud_08-300x225.jpg" alt="Устройството изглежда съвсем достоверно" width="300" height="225" /></a><p class="wp-caption-text">Устройството за запис на данните от картата изглежда съвсем достоверно</p></div>
<p style="text-align: left;">
<div id="attachment_5493" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skim1-2.jpg"><img class="size-medium wp-image-5493" title="Още един пример" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skim1-2-300x295.jpg" alt="" width="300" height="295" /></a><p class="wp-caption-text">Още един пример</p></div>
<p>Не е изключено дори поставянето на цял фалшив банкомат. При поставяне на картата във фалшив банкомат и опит за изтегляне на пари (тоест въвеждане на PIN код), устройството  връща картата и се извинява със съобщение, че &#8222;не може да извърши тази услуга в момента&#8220;. Истината е, че има дори регистрирани случай, в които фалшиви банкомати  дават пари на хората, когато става въпрос за по-малки суми. Тези банкомати дефакто въобще не са свързани с общата банкова система и не правят никакво валидиране на вашия PIN код. Единствения начин да разберете, че сте били измамен е ако забележите, че никой не ви е взел пари от банковата сметка.</p>
<p style="text-align: left;">Най-масовият случай на кражба на ATM карти е в търговската мрежа. Има два начина &#8211; единият е чрез поставяне на четец върху истинско устройство (много подобно на представеното за банкомат по-горе, но по-миниатурно). Понякога измамниците дори правят цяла нова &#8222;опаковка&#8220; на електрониката на истинското устройство така, че да може да се вкара допълнителното четящто устройство.</p>
<p style="text-align: left;">Другият начин е с конкретно фалшиво устройство &#8211; подобно на примера с фалшив банкомат, отново не ви взимат пари за покупката, но вашата информация за картата е открадната. Съмнение у вас може да се подбуди ако при по-голяма покупка жената на касата започне да се извинява, че устройството при нея не работи и ви моли да отидете на друг щанд (където е истинското устройство, което е легитимно). Това е така, защото при по-големи покупки измамниците излизат на загуба.</p>
<p style="text-align: left;">Друг изключително популярен начин е чрез така наречените &#8222;mobile ATM skimmers&#8220;. Това са миниатюрни устройсва, които измамникът държи в ръката си. Когато вие му подадете картата той я прекарва през устройството незабелязано, а после я слага в истинския апарат. В последствие ви гледа в ръцете, за да научи вашия PIN код. Ето как изглеждат няколко такива устройства (снимки от <a href="http://jheary.com" target="_blank">jheary.com</a>):</p>
<p style="text-align: center;"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type1.jpg"><img class="aligncenter size-medium wp-image-1977" title="Mobile skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type1-300x211.jpg" alt="Mobile skimmer" width="300" height="211" /></a></p>
<p style="text-align: center;"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type2.jpg"><img class="aligncenter size-medium wp-image-1978" title="Mobile skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type2-300x253.jpg" alt="Mobile skimmer" width="300" height="253" /></a></p>
<p style="text-align: center;"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type3.jpg"><img class="aligncenter size-medium wp-image-1979" title="Mobile skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type3-300x221.jpg" alt="Mobile skimmer" width="300" height="221" /></a></p>
<p style="text-align: center;"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type4.jpg"><img class="aligncenter size-medium wp-image-1980" title="skimmer-type4" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type4-300x235.jpg" alt="skimmer-type4" width="300" height="235" /></a></p>
<p style="text-align: center;"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type5.jpg"><img class="aligncenter size-medium wp-image-1982" title="Mobile skimmer" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type5-300x212.jpg" alt="Mobile skimmer" width="300" height="212" /></a></p>
<p style="text-align: center;"><a href="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type7.jpg"><img class="aligncenter size-medium wp-image-1981" title="skimmer-type7" src="http://www.cphpvb.net/wp-content/uploads/2009/06/skimmer-type7-300x201.jpg" alt="skimmer-type7" width="300" height="201" /></a></p>
<p style="text-align: left;">За нещастие защитата от кражби в търговската мрежа е изключително трудна. Вярвате ли в честността на сервитьорката в ресторанта? А продавачката в магазина за обувки? Проблемът ще се задълбочава с все по-масовото използване на &#8222;електронни пари&#8220;. С днешното ниво на сигурност на ATM картите единственият начин да сте напълно убедени, че няма да откраднат пари от вас, е като редовно сменяте PIN кода си на банкомати, които познавате като сигурни. За съжаление това е изключително рядка практика при нормалния човек и затова се търсят по-иновативни решения. В по-следващи статии ще се запознаем с технически детайли за ATM картите и съвремените методи за защита на информацията в тях.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/1944-atm-%d0%ba%d0%b0%d1%80%d1%82%d0%b8/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Оптимизиране на Apache</title>
		<link>http://www.cphpvb.net/network-security/1455-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-apache/</link>
		<comments>http://www.cphpvb.net/network-security/1455-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-apache/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 17:11:35 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=1455</guid>
		<description><![CDATA[Apache е най-популярният http сървър в интернет. Както всеки сървър той също има специфични настройки, които могат значително да повишат производителността на системата. Много от тях са особено важни и за сигурността &#8211; например при справянето с DoS атаки. Файлът за настройки на Apache е с име httpd.conf. Понякога този файл зарежда свои дъщерни (httpd-vhosts.com, [...]]]></description>
			<content:encoded><![CDATA[<p>Apache е най-популярният http сървър в интернет. Както всеки сървър той също има специфични настройки, които могат значително да повишат производителността на системата. Много от тях са особено важни и за сигурността &#8211; например при справянето с DoS атаки.</p>
<p>Файлът за настройки на Apache е с име httpd.conf. Понякога този файл зарежда свои дъщерни (httpd-vhosts.com, httpd-aliases.conf, и т.н.). Обикновено специфичните настройки на сървъра се слагат във файл httpd-default.conf. Подобно на настройките за MySQL, за които споменахме по-рано, и тук всичко се променя изключително лесно с проста промяна на стойност:<span id="more-1455"></span></p>
<p>1. <strong>HostnameLookups Off</strong></p>
<p>Ако HostnameLookups е включен, то за всеки един &#8222;hit&#8220; към сървъра се прави DNS lookup, за да се транслира IP адреса на клиента в hostname. От една страна това е добре, защото по този начин сме сигурни, че информацията не е подменена (spoofed). На практика обаче това най-вероятно не ви трябва. Често администраторите правят въпросния DNS lookup в последствие, чрез софтуер за преглеждане на log файлове. Разликата в бързодействието на сървъра, особено при много натоварени машини, е значително.</p>
<p>2. <strong>ServerSignature Off</strong></p>
<p>Когато клиента попадне на някоя от стандартните страници на Apache (directory listing, 404, 401, и т.н.), то обикновено сървъра изписва името и версията си най-отдолу. Едва ли искаме да даваме тази информация на който и да е. Въпреки, че въобще не е трудно да се познае, че сървъра е Apache, то въобще няма нужда да даваме информация за конкретната версия.</p>
<p>3. <strong>ServerTokens Prod</strong></p>
<p>Същото, което казахме за ServerSignature важи и за всеки HTTP header, който се изпраща към клиента. Ако тази стойност е FULL се дава информация дори за операционната система. Prod е възможно най-минималната информация за системата, която е нужна, за да може да се функционира нормално.</p>
<p>4. <strong>KeepAlive On</strong></p>
<p>Обикновено на една HTML страница има свързани редица обекти (javascript файлове, картинки, флаш анимации, и т.н.). Ако KeepAlive е изключено, то за всеки един файл ще бъде правена нова връзка към сървъра. Това естествено води до забавено бързодействие. При натоварени сървъри е задължително да бъде включен KeepAlive &#8211; така клиентът изтегля повече от един файл с една връзка.</p>
<p>5. <strong>KeepAliveTimeout 3</strong></p>
<p>Колкото и да помага, KeepAlive естествено си има и своите минуси. Най-големия е, че може клиенти да отварят връзки и да не ги приключват. Това се случва често при DoS атаки. Затова е нужен таймер за затваряне на връзката &#8211; това се явява KeepAliveTimeout. Стойността 3 секунди е приемлива за съвременните интернет връзки. Въпреки това при клиенти, които имат бавна връзка и са прекалено много отдалечени от сървъра би се получило така, че връзката ще се затвори преди да успеят да направят следваща заявка за файл.</p>
<p>6. <strong>MaxKeepAliveRequests 100</strong></p>
<p>Максимална стойност за поискани файлове с една връзка. Например ако имате html страница с 100 снимки, то клиентът трябва да свали 101 файла (1 html + 100 jpg), т.е. при &#8222;MaxKeepAliveRequests 100&#8243; ще са му нужни две връзки.</p>
<p>7. <strong>MaxClients 2000</strong></p>
<p>Когато се свърже към сървъра, за него се стартира работен процес. Всеки един от тях обработва по няколко клиентски заявки, след което се изключва. Ако имате много клиенти едновременно, то е добре да увеличите тази стойност. Тя контролира максималният брой процеси, които се стартират. Добра формула е следната:</p>
<p>RAM памет отделена за Apache = MaxClients * Max child process size</p>
<p>8. <strong>StartServers 10</strong></p>
<p>Тази опция дефинира колко процеса да бъдат стартирани първоначално.</p>
<p>9. <strong>MinSpareServers 10</strong></p>
<p>Колко да бъдат максимално свободните процеси (т.е. такива, които не обработват клиентски заявки, а чакат). Добре е да пазим поне 5. Стремежът ни все пак е да не се стартират повече от 4 Apache процеса за една секунда &#8211; ако това стане, то е добре да увеличаваме тази стойност.</p>
<p>10. <strong>MaxSpareServers 30</strong></p>
<p>От друга страна не е добре да имаме прекалено много свободни процеси. Добре е да ги затворим и да дадем оперативна памет на други програми.</p>
<p>11. <strong>MinSpareThreads 25</strong></p>
<p>Минималното количество от обработващи нишки, за всеки свободен процес.</p>
<p>12. <strong>ThreadsPerChild 25</strong></p>
<p>Константно количество нишки за всеки процес</p>
<p>13. <strong>MaxRequestsPerChild 8000</strong></p>
<p>По подразбиране стойността е 0, т.е. &#8222;безкрайност&#8220;. Важно е обаче да сложим такъв лимит за дъщерните процеси. Ако имаме &#8222;утечка на памет&#8220; (memory leak), то при достигане на MaxRequestsPerChild тя ще бъде &#8222;пресечена&#8220;.</p>
<p>14. <strong>Timeout 60</strong></p>
<p>Максималното време, което Apache ще отдели за една връзка към него (в секунди). Например при качване на много голям файл през POST показаното в примера може да не е достатъчно. Стойността по подразбиране е 300.</p>
<p>Освен изброените по-горе стандартни настройки, има и редица допълнителни модули за Apache, които са изключително важни. Такива са например mod_deflate (отговорен за компресирането на данни), mod_cache (за кеширане на данни), mod_expires и mod_headers (за кеширане на HTTP headers). Повечето от полезните модули са включени в стандартната инсталация.</p>
<p>Има обаче един модул, на който искаме да обърнем специално внимание &#8211; това е известният mod_dosevasive. Чрез него можете да блокирате заявки от дадени клиенти за определено време. Например при flood от едно IP вие не бихте искали всеки път да бъде компилиран PHP файл. Чрез mod_dosevasive модула можете да укажете например, че ако от даден IP адрес се получат повече от 20 заявки за една секунда, то да бъде блокиран достъпа му за определено време (например 5-6 секунди). По принцип стойността се слага така, че сървъра да може да обслужи най-голямата си страница за една секунда, без клиента да бъде блокиран. Затова от примера по-горе, при html страница с 100 картинки, бихме сложили стойност на mod_dosevasive над 100. Този модул има изключително положителен ефект при DoS атаки!</p>
<p>Друг много известен модул свързан със сигурността е mod_security. Той действа като firewall за Apache, като следи за известни атаки или съмнителна активност на даден клиент. Силно препоръчваме включването на този модул въпреки, че по принцип намалява бързодействието на сървъра в нормална ситуация (без атака срещу него).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/1455-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8%d0%b7%d0%b8%d1%80%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-apache/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Настройки на sysctl.conf под FreeBSD</title>
		<link>http://www.cphpvb.net/network-security/1425-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d0%bd%d0%b0-sysctlconf-%d0%bf%d0%be%d0%b4-freebsd/</link>
		<comments>http://www.cphpvb.net/network-security/1425-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d0%bd%d0%b0-sysctlconf-%d0%bf%d0%be%d0%b4-freebsd/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 22:06:17 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=1425</guid>
		<description><![CDATA[Много хора не знаят, че във файла /etc/sysctl.conf за настройки на ядрото на Unix-базираните операционни системи се съдържат изключително много възможности за подобряване на стабилността на системата, а оттам и нейната сигурност. В настоящата статия ще разгледаме някои важни настройки за мрежовия адаптер и още други свързани със сигурността на системата. Повечето от тях ще [...]]]></description>
			<content:encoded><![CDATA[<p>Много хора не знаят, че във файла /etc/sysctl.conf за настройки на ядрото на Unix-базираните операционни системи се съдържат изключително много възможности за подобряване на стабилността на системата, а оттам и нейната сигурност.</p>
<p>В настоящата статия ще разгледаме някои важни настройки за мрежовия адаптер и още други свързани със сигурността на системата. Повечето от тях ще подобрят сигурността на системата и ще я направят много по-малко уязвима от слаби DDoS атаки. Разгледаните настройки са само за системи работещи под FreeBSD. Други операционни системи имат свои алтернативни опции.<span id="more-1425"></span></p>
<p>1. <strong>security.bsd.see_other_uids=0</strong></p>
<p>Ако тази опция е разрешена, то процеси без привилегии ще могат да виждат други обекти с различен реален групов идентификатор (gid). Нормално не бихме искали това да става.</p>
<p>2. <strong>net.inet.tcp.msl=15000</strong></p>
<p>MSL е съкращение от &#8222;Maximum Segment Life&#8220; за TCP/IP. Това е максималното време в милисекунди, което ще се изчаква за един ACK в отговор на SYN-ACK или FIN-ACK. Ако след изтичане на това време не се получи отговор, то сегмента се счита за загубен и мрежовата връзка се освобождава. RFC стандарта дефинира MSL да бъде 120000ms, което в днешно време с бързи интернет връзки е напълно неоправдано. Стандартната стойност за FreeBSD е 30000, но статистиката показва, че дори намалявайки я наполовина няма никакви проблеми. Ако обаче често изпитвате силни DoS атаки, то можете да го намалите и под 8000.</p>
<p>3. <strong>net.inet.tcp.blackhole=2</strong></p>
<p>Знаете ли какво се случва, когато се изпрати TCP пакет към затворен порт на системата? Истината е, че при стандартната стойност 0 се връща отговор до запитващия, с който му съобщаваме, че порта е затворен. Ако сложите стойност 1, то всички SYN заявки ще бъдат просто пропуснати и отговор няма да се върне. Това е подгодящо при известният SYN FLOOD. Стойност 2 означава, че всякакви заявки ще бъдат пропускани напълно. Поради тази причина променливата се нарича и черна дупка (blackhole).</p>
<p>4. <strong>net.inet.udp.blackhole=1</strong></p>
<p>С абсолютно аналогично действие като миналата променлива, но тук става въпрос за UDP връзки.</p>
<p>5. <strong>net.inet.icmp.icmplim=50</strong></p>
<p>Отново важна опция за защита срещу DoS атаки и също така скенери на портове. Чрез нея задавате лимит на максималния брой ICMP заявки, на които системата ще отговори за една секунда.</p>
<p>6. <strong>kern.ipc.somaxconn=16384</strong></p>
<p>Чрез тази променлива се контролира броят на &#8222;слушащите&#8220; сокети в системата, които очакват нови TCP заявки. Стандартната настройка е едва 128, което е изключително лесна за запълване дори чрез слаба SYN FLOOD атака. Повечето администратори предпочитат да не слагат повече от 1024. Истината е, че съвременната техника и хардуер нямат проблем да се справят и с много по-големи стойности.</p>
<p>7. <strong>kern.ipc.maxsockets = 32768</strong></p>
<p>Чрез тази настройка се контролира максималния брой sockets, които могат да се поддържат отворени едновременно.</p>
<p>8. <strong>net.inet.tcp.maxtcptw=8192</strong></p>
<p>Когато TCP връзка премине в TIME_WAIT статус нейният сокет се освобождава и се отваря нова структура, която пази възможно най-минимална информация. Тази структура се нарича &#8222;компресиран TCP TIME_WAIT статус&#8220;. Понеже големината е значително по-малка от нормалния сокет, то можем да спечелим значително количество памет. Провенливата net.inet.tcp.maxtcptw контролира максималният брой от такива структури, които могат да се инициализират. В общи линии гледаме да е между 4 и 5 пъти по-малка стойност от maxsockets.</p>
<p>9. <strong>net.inet.tcp.nolocaltimewait=1</strong></p>
<p>Трябва ли да очакваме връзки от localhost да изпадат в TIMEWAIT статус? По-скоро не.</p>
<p>10. <strong>net.inet.ip.portrange.first=1024<br />
net.inet.ip.portrange.last=65535</strong></p>
<p>Тук просто разширяваме полето на възможни изходящи портове от стандартното 49152 – 65535 на доста по-широкия интервал 1024 – 65535.</p>
<p>11. <strong>net.inet.ip.portrange.randomized=0</strong></p>
<p>По този начин използваме портовете в стандартната си наредба вместо в произволна. По този начин правим втора връзка към същия порт невъзможна преди попадане в режим TIME_WAIT.</p>
<p>12. <strong>net.inet.tcp.finwait2_timeout=30000</strong></p>
<p>Контролира максималното време за прекъсване на връзка напълно.</p>
<p>13. <strong>net.inet.tcp.fast_finwait2_recycle=1</strong></p>
<p>По подразбиране тази опция също е спряна. Това решава рядък, но много неприятен flood на системата, които може да остави хиляди затворени peers, които не са затворени във FIN_WAIT_2 статус за много дълго време.</p>
<p>14. <strong>net.inet.ip.fw.dyn_buckets=4096</strong><br />
<strong>net.inet.ip.fw.dyn_syn_lifetime=5</strong><br />
<strong>net.inet.ip.fw.dyn_max=16384</strong></p>
<p>Тук се контролират стартовия брой на слотове в хеш таблизата за динамични правила на IPFW, както и максимално допустимият им брой.</p>
<p>15. <strong>net.inet.ip.forwarding=0</strong></p>
<p>Искате ли IP Forwarding между интерфейси? Стандартно най-вероятно не.</p>
<p>16. <strong>net.inet.icmp.drop_redirect=1</strong><br />
<strong>net.inet.icmp.log_redirect=0</strong></p>
<p>По този начин ще забраните всякакви ICMP пренасочвания.</p>
<p>17. <strong>net.inet.ip.intr_queue_maxlen=512</strong></p>
<p>Контролира максималната дължина на входната опашка за IP.</p>
<p>18. <strong>net.inet.ip.random_id=1</strong></p>
<p>Чрез тази опция правите така, че ID полето на IP пакетите ще бъде с произволна стойност, вместо да се увеличава винаги с 1. На практика това спестява минимално количество изтичане на статистическа информация, тъй като е възможно някой да следи големината на вашия трафик чрез брояча.</p>
<p>19. <strong>net.inet.tcp.drop_synfin=1</strong></p>
<p>В реалния свят едва ли има нормални TCP клиенти, които ще изпратят SynFin. Поради тази причина не е зле да ги премахнем напълно.</p>
<p>20. <strong>net.inet.ip.redirect=0</strong></p>
<p>В стандартна система едва ли ви трябват IP пренасочвания.</p>
<p>21. <strong>net.inet.tcp.syncookies=1</strong></p>
<p>Нека да използваме TCP SYN cookies ако &#8222;syncache&#8220; се запълни.</p>
<p>22. <strong>net.inet.tcp.delayed_ack=0</strong></p>
<p>Delayed ACK означава, че TCP не отговаря моментално с ACK на всеки единичен TCP сегмент. След като се получи самотен TCP сегмент то ще се изчака около 100-150ms с презумцията, че приложението ще даде някакъв отговор. Например в SSH връзка при натискането на клавиш обикновено очакваме да получим в отговор със изписан символ от конзолата. Не бихме искали да изпращаме празни ACK, последвани от TCP пакет с информация веднага след това. Затова забавяме изпращането на ACK с надеждата да ги изпратим заедно. В реални условия се оказва, че това може да е в по-голяма вреда, отколкото полза. Доказани са редица възможни проблеми, затова се препоръчва да се изключи.</p>
<p>23. <strong>net.inet.udp.maxdgram=57344</strong><br />
<strong>net.inet.udp.recvspace=57344</strong></p>
<p>Максимална големина на изходящ и входящ UDP datagram.</p>
<p>24. <strong>kern.ipc.maxsockbuf=2097152</strong>,<br />
<strong>net.inet.tcp.sendspace=2097152</strong><br />
<strong>net.inet.tcp.recvspace=2097152</strong></p>
<p>Дефинират максималната големина в байтове, която може да се задели за изпращащ и приемащ буфер. Първата променлива (maxsockbuf) може да се приеме като глобална лимитираща променлива за другите две.</p>
<p>25. <strong>net.inet.ip.rtexpire=3</strong></p>
<p>Стандартно време за &#8222;забравяне&#8220; на динамично маршрути.</p>
<p>26. <strong>net.inet.ip.rtminexpire=2</strong></p>
<p>Минимално време за задържане на в динамични маршрути.</p>
<p>27. <strong>net.inet.ip.rtmaxcache=256</strong></p>
<p>Максимален лимит за брой динамични маршрути.</p>
<p>28. <strong>net.inet.icmp.maskrepl=0</strong></p>
<p>Забрана за отговаряне на ICMP Mask заявки.</p>
<p>29. <strong>net.icmp.bmcastecho=0</strong></p>
<p>Това ни защитава от т.нар. SMURF атаки. Тези атаки изпращат ICMP пакети до broadcast адрес от spoofed IP адрес.</p>
<p>30. <strong>net.inet.tcp.icmp_may_rst=0</strong></p>
<p>Така ще игнорираме всички ICMP пакети, които са генерирани от филтриране на gateway/router между вас и крайната точка. Това е някаква минимална защита от атака с &#8222;човек в средата&#8220;, където рутер на атакуващия може да блокира избирателно изходящи пакети от вашата машина. Също така това може потенциално да доведе и до DoS атака.</p>
<p>31. <strong>kern.ipc.nmbclusters=32768</strong></p>
<p>NMBClusters указва в ядрото какво количество буфери са налични за системата. Такова увеличение се използва само за силно натоварени системи. Всеки клъстер е около 2KB памет, т.е. тази стойност отнема 64MB оперативна памет от системата. Такава стойност е подходяща за сървъри обслужващи около 1000 едновременни връзки.</p>
<p>32. <strong>kern.maxfiles=65536</strong></p>
<p>Тази променлива контролира колко е максималният брой файлове, които могат да бъдат отворени едновременно в системата.<br />
П.С. Никога не се пробвайте да го сложите &#8222;unlimited&#8220;. Резултатът е, че всъщност ще станат 0 и системата ще блокира напълно.</p>
<p>33. <strong>net.inet.ip.sourceroute=0</strong><br />
<strong>net.inet.ip.accept_sourceroute=0</strong></p>
<p>Забранява използването и приемането на &#8222;source routed IP packets&#8220;.</p>
<p>Надявам се, че с тези настройки ще бъда полезен. Не гарантирам, че те са оптимални. Препоръчвам ги за наистина натоварени сървъри и такива, които често страдат от DoS атаки. Също така се предполага, че се използва модерен хардуер и поне 2GB RAM.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/1425-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d0%bd%d0%b0-sysctlconf-%d0%bf%d0%be%d0%b4-freebsd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Защита от brute force атаки</title>
		<link>http://www.cphpvb.net/network-security/586-%d0%b7%d0%b0%d1%89%d0%b8%d1%82%d0%b0-%d0%be%d1%82-brute-force-%d0%b0%d1%82%d0%b0%d0%ba%d0%b8/</link>
		<comments>http://www.cphpvb.net/network-security/586-%d0%b7%d0%b0%d1%89%d0%b8%d1%82%d0%b0-%d0%be%d1%82-brute-force-%d0%b0%d1%82%d0%b0%d0%ba%d0%b8/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 14:29:08 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=586</guid>
		<description><![CDATA[&#8222;Brute Force&#8220; е атака, при който атакуващият изпраща множество заявки към сървъра с различни двойки от име и парола, с цел да &#8222;налучка&#8220; някоя правилна комбинация. Най-често на атака са изложени потребителски имена като &#8222;admin&#8220;, &#8222;administrator&#8220;, &#8222;root&#8220;, и т.н. По този начин атакуващият се опитва да получи достъп до даден защитен ресурс, без да използва пробив в сигурността. Първото [...]]]></description>
			<content:encoded><![CDATA[<p>&#8222;Brute Force&#8220; е атака, при който атакуващият изпраща множество заявки към сървъра с различни двойки от име и парола, с цел да &#8222;налучка&#8220; някоя правилна комбинация. Най-често на атака са изложени потребителски имена като &#8222;admin&#8220;, &#8222;administrator&#8220;, &#8222;root&#8220;, и т.н. По този начин атакуващият се опитва да получи достъп до даден защитен ресурс, без да използва пробив в сигурността.</p>
<p>Първото и основно правило за защита срещу brute force атаки е да използваме колкото се може по-сложни пароли. Обикновено тези атаки изпробват набор от речникови думи, имена и понякога цифри. Освен това, независимо колко сложна е вашата парола, не е добра идея да я използвате за всички сайтове, на които влизате (най-малкото администратора на чуждият уеб сайт ще може да проникне във вашия личен).</p>
<p>Независимо колко стриктна и добра политика използваме за паролите ние не бихме искали да позволим някой да изпробва стотици комбинации от имена и пароли върху вашата система. Най-малкото не сме сигурни дали някой от нашите потребители не използва лесна за разгадаване парола &#8211; например името си в комбинация с годината на раждане: &#8222;Иван1978&#8243;. Една целенасочена атака срещу този потребител би изпробвала различни комбинации от данни, които са свързани с потребителя Иван. Паролата от своя страна изглежда сигурна (съдържа и думи и цифри) и би преминала вашия валидатор. Поради тази причина е наложително да се защитите, като едновременно с това не затруднявате потребителя излишно.<span id="more-586"></span></p>
<p>1. <strong>Captcha</strong>: вече разгледахме използването на <a href="http://www.cphpvb.net/network-security/580-captcha/" target="_blank">Captcha</a> за целта за спиране на автоматизирани brute force атаки. Това е може би най-ефективният разработен досега метод за справяне с проблема на автоматизирани атаки. За съжаление този подход определено затруднява потребителите, като отнема допълнително време при всяко влизане в системата. Captcha е подходяща за защита на форми, които се попълват еднократно (например форми за регистрация). Когато става дума за форми за автентикация, които се попълват ежедневно, то въпросът е спорен. Всичко зависи от това до колко конфиденциална информация пазите и дали си заслужава да затруднявате потребителя с попълването на форма с captcha всеки път. Освен това captcha не решава друг проблем &#8211; не е казано, че една brute force атака трябва да е автоматизирана. Не е изключено човек ръчно да изпробва различни комбинации от имена и пароли. Все пак не говорим за ограничения във времето&#8230;</p>
<p>2. <strong>Блокиране на IP</strong> след определен брой неуспешни опита за влизане: можете да си съставите база от данни със списък от IP адреси, които са направили неуспешен опит за влизане в системата. За всеки IP адрес трябва да се пази и втора колона със брой неуспешни опити за достъп. По този начин, преди да извършите проверка за автентикация на данните, може да проверите дали текущото IP не е &#8222;прекалило&#8220; с грешните опити за вход в системата и ако това е така &#8211; да го пренасочите към друга страница, която му предоставя информация как да си поиска от вас загубената парола. В зависимост от типа потребители на вашата система можете да блокирате не само отделни IP адреси, но и цели зони (IP range). При успешно автентикиране в системата от даден IP адрес, неговите записи в базата от данни за неуспешни влизания трябва да бъдат изтрити, за да се избегне натрупване на случайни грешки през големи интервали от време. Чрез метода за блокиране на IP се справяте не само с автоматизираните атаки, но и с атаките извършвани от човек. Честа практика (с цел редуциране на заявките за отблокиране на IP адреси към екипа за техническа поддръжка) е да не блокирате потребителите перманентно, а само за определено време (например един час). Така обаче защитата само &#8222;отлага&#8220; атаката, а не я предотвратява.</p>
<p>3. <strong>Лимит на максималния брой заявки към сървъра чрез защитна стена</strong>: един IP адрес би могъл да изпрати множество заявки за автентикация към сървъра едновременно. По този начин ние все още няма да имаме запис за това IP и бихме могли да позволим на заявките да преминат &#8222;бариерата&#8220; от предишната точка. Обикновено не е разумно да натоварвате самото приложение със следене на броя заявки към него. Добре е да сложите такъв лимит на вашия http сървър и на вашата защитна стена (firewall). Например за iptables може да използвате модула &#8222;connlimit&#8220;.</p>
<p>4. <strong>Лимит на максималния брой заявки към сървъра чрез приложението</strong>: ако все пак искате да се подсигурите и да предотвратите напълно едновременно подадените заявки за автентикация, то може да организирате приложение от тип &#8222;опашка за автентикация&#8220;. Всяка заявка за автентикиране се вкарва в структура от данни тип FIFO (first in &#8211; first out) и така сме сигурни, че никога няма да бъдат изпълнени няколко едновременни заявки към базата от данни. Този метод обаче трябва да се използва изключително внимателно и изисква сериозна оптимизация с цел бързодействие. Добре е да се погрижите да има равностойно бързодействие на базата от данни спрямо http сървъра. В противен случай рискувате да получите претрупване на опашката и много клиенти да получават timeout. Затова е добре в http сървъра да пазите cache от познати &#8222;лоши&#8220; IPта и да не им позволявате да влизат в опашката за автентикация повторно. Периодично трябва да филтрирате сървъра чрез защитната стена от подобни IP адреси, които правят постоянни заявки. Това ще бъде разгледано в темата за DDoS атаки. При мултипроцесорни сървъри (каквито са почти всички нови компютри в днешно време) е добре да се възползвате от използването на нишки за съставянето на няколко опашки за автентикация (в зависимост от броя процесори на сървъра за базата от данни). Не е разумно да се лишавате напълно от бързодействието и функционалностите на сървъра си само и единствено с цел защита. Ползата от &#8222;опашка за автентикация&#8220; по принцип е спорна и в повечето случаи се оказва излишна.</p>
<p>5. <strong>Политика за блокиране на акаунти</strong>: става дума за атаки от т.нар. &#8222;bot nets&#8220;. Това са мрежи от различни IP адреси, които атакуват сървъра. Често това са инфектирани с вирус компютри на нищо неподозиращи потребители в Интернет. Мащабът на такава мрежа може да бъде огромен. Също така не е задължително те да атакуват по едно и също време  (което всъщност би причинило по-скоро DDoS атака), а през кратки интервали. Тук тактиката с блокиране на отделно IP след неуспешен брой опити за вход би била неуспешна, защото всяко едно IP от атакуващата мрежа само за себе си има определен брой опити. Ако например сме сложили лимит от 5 неуспешни опита за IP адрес, то една мрежа от 1000 IPта би имала 5000 опита. Когато те атакуват определен акаунт (администраторския или на някой определен потребител), то би трябвало да се почувстваме застрашени, защото ще изпробват прекалено много различни комбинации от възможности (тъй като това е &#8222;targeted&#8220; атака, то атакуващите обикновено са разузнали за определена информация за дадения потребиел). За да се защитим от такава атака е добре да пазим допълнително поле в базата от данни, в която се съхраняват имената и паролите. Това поле трябва да съдържа общия брой неуспешни опити за влизане към дадения акаунт. Когато се извършва автентикацията е нужно да се провери този запис и ако броя опити за пробив е голям, то е добре да се направи т.нар. &#8222;заключване на потребителския акаунт&#8220; (account lockdown). Системата няма да позволи достъп до такъв потребителски акаунт, докато администратор не &#8222;отключи&#8220; акаунта. По този начин можете да съставите списък от атакувани акаунти и да се погрижите техните пароли да са достатъчно сигурни или да търсите индивидуално решение на тяхната защита.</p>
<p>6. <strong>Фиксиране на акаунт по IP адрес</strong>: в случай на зачестили атаки към определен акаунт може да въведете функционалност за стриктно следене на IP адреса, от който влиза. Това е честа практика при администраторските акаунти.</p>
<p><strong>Задача</strong>: Реализирайте описаните практики на някой език за web програмиране. Помислете за допълнителни варианти за защита.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/586-%d0%b7%d0%b0%d1%89%d0%b8%d1%82%d0%b0-%d0%be%d1%82-brute-force-%d0%b0%d1%82%d0%b0%d0%ba%d0%b8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Captcha</title>
		<link>http://www.cphpvb.net/network-security/580-captcha/</link>
		<comments>http://www.cphpvb.net/network-security/580-captcha/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 13:18:11 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=580</guid>
		<description><![CDATA[Captcha е името на широко използвана техника за защита на форми. Тя е съкращение от &#8222;Completely Automated Public Turing test to tell Computers and Humans Apart&#8220;, което преведено означава “напълно автоматизирана проверка за разграничаване на човек от компютър”. Процеса на проверка изисква един компютър (сървър) да поиска отговора на прост въпрос, но по начин, който [...]]]></description>
			<content:encoded><![CDATA[<p>Captcha е името на широко използвана техника за защита на форми. Тя е съкращение от &#8222;Completely Automated Public Turing test to tell Computers and Humans Apart&#8220;, което преведено означава “напълно автоматизирана проверка за разграничаване на човек от компютър”. Процеса на проверка изисква един компютър (сървър) да поиска отговора на прост въпрос, но по начин, който предотвратява възможноста за автоматизирано намиране на отговора от компютър. По този начин всеки потребител въвел правилен отговор бива упълномощен с права за достъп и ние сме сигурни, че той е човек, а не машина (bot). Тази техника премахва следните проблеми в сигурноста на системата:<span id="more-580"></span></p>
<ul>- Защитава форми, които попълват информация в база от данни от автоматични скриптове, които запълват базата от данни с невалидни данни.</ul>
<ul>- Не позволява на компютър да изпробва произволни комбинации от имена и пароли и по този начин защитава потребителските акаунти.</ul>
<p>Изпълнението на модула за защита преминава през няколко етапа:</p>
<p>а) Генериране на произволен код, обикновено съставен от букви и цифри;</p>
<p>б) Записване на генерирания код в потребителската сесия;</p>
<p>в) Използвайки модул за генериране на графични изображения (например в PHP това е GD2) се създава картинка, на която се изобразява генерирания код. Обикновено се добавя &#8222;шум&#8220; (distortion), чрез който затрудняваме автоматизираното разпознаване на кода от машина. Обикновено е добре да се изобразяват букви с различни шрифтове, като самите те се завъртат под произволен (в дадени граници) ъгъл. Размерите на самата картинка и големината на буквите също могат да варират в даден интервал. Крайната цел е да се затруднят компютърните алгоритми за разпознаване на изображения, но до такава степен, че да не затрудняват истинския потребител прекалено много;</p>
<p>г) Картинката се отпечатва на екрана на потребителя до формата, която ще бъде попълвана. В самата форма се слага допълнително текстово поле, в което потребителя трябва да въведе кода от картинката за валидация;</p>
<p>д) Кода от формата, заедно с останалите данни, се изпращат чрез метода POST и системата сравнява стойноста на кода въведен във формата с този, записан в потребителската сесия. Ако двете стойности съвпадат, то приемаме, че заявката е попълнена от човек, а не машина.</p>
<p>Въвеждането на CAPTCHA е първата важна стъпка за предпазване на формите от brute force атаки. Ето няколко лоши практики, които <strong>не трябва да се използват</strong>:</p>
<p>- Използване на предварително зададени комбинации от кодове. Учудващо е, че все още се срещат форми, които са &#8222;защитени&#8220; чрез предварително генерирана серия от картинки и записана комбинация от техните кодове. Това действително пести системни ресурси (генерирането на изображение е тежка операция), но в никакъв случай не може да бъде разглеждано дори като значима защита. Атакуващият може да си изгради собствена база от данни, в която да записва името на подадена картинка със съответващия й код &#8211; до пълно изчерпване;</p>
<p>- Прекалено трудни за разчитане изображения, букви излизащи от границите на изображението, припокриващи се букви. Запомнете, че все пак потребителя трябва да има шанс да влезе в системата;</p>
<p>- Използването на двусмислени символи ще обърка потребителите. Избягвайте да използвате буквата &#8222;O&#8220;, защото тя може да бъде объркана с &#8222;0&#8243;. Същото важи за &#8222;l&#8220;, &#8222;I&#8220; и &#8222;1&#8243;.</p>
<p>Ето едно изображение, на което са демонстрирани различни Captcha варианти:</p>
<div id="attachment_581" class="wp-caption aligncenter" style="width: 281px"><img class="size-medium wp-image-581" title="Варианти на Captcha" src="http://www.cphpvb.net/wp-content/uploads/2008/12/captchas-271x300.jpg" alt="Варианти на Captcha" width="271" height="300" /><p class="wp-caption-text">Варианти на Captcha</p></div>
<p>Друг често използван подход е да се зададе проста задача на потребителя - например &#8222;колко е две плюс три&#8220; или &#8222;напишете фамилното име на Петър Иванов&#8220;. За съжаление тук ще се нуждаем от значително количество въпроси в базата от данни, а това ще е трудна задача (те трябва да са прости, защото едва ли можем да очакваме всеки потребител да може да решава интеграли). Съществуват и редица изключително интересни варианти, като например <a href="http://www.bad-neighborhood.com/puzzcaptcha.htm" target="_blank">puzz captcha</a>.</p>
<p>При Captcha основният проблем е фактът, че колкото по-добра е защитата, толкова по-трудно е за крайният потребител.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/580-captcha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code Injection &#8211; вмъкване на нежелан код</title>
		<link>http://www.cphpvb.net/network-security/569-code-injection-%d0%b2%d0%bc%d1%8a%d0%ba%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%bd%d0%b5%d0%b6%d0%b5%d0%bb%d0%b0%d0%bd-%d0%ba%d0%be%d0%b4/</link>
		<comments>http://www.cphpvb.net/network-security/569-code-injection-%d0%b2%d0%bc%d1%8a%d0%ba%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%bd%d0%b5%d0%b6%d0%b5%d0%bb%d0%b0%d0%bd-%d0%ba%d0%be%d0%b4/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 08:46:51 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=569</guid>
		<description><![CDATA[Вече разгледахме статии, в които описахме проблемите за вмъкване на нежелан SQL код и XSS атаки. Те всъщност са част от една по-широка общност, която можем да наречем общо &#8222;вмъкване на нежелан код&#8220;. SQL injection целеше да повреди базата данни, а XSS атаките целяха да подведат потребител на системата. Логично остава още едно звено за [...]]]></description>
			<content:encoded><![CDATA[<p>Вече разгледахме статии, в които описахме проблемите за вмъкване на нежелан SQL код и XSS атаки. Те всъщност са част от една по-широка общност, която можем да наречем общо &#8222;вмъкване на нежелан код&#8220;. SQL injection целеше да повреди базата данни, а XSS атаките целяха да подведат потребител на системата. Логично остава още едно звено за атака &#8211; файловата система на сървъра. Знаете, че скриптовете, писани на езици като PHP, ASP, JSP, и др, се компилират и изпълняват на сървъра. Това дали означава, че тяхния сорс код е предпазен от модифициране?</p>
<p>Нека разгледаме няколко примера:<span id="more-569"></span></p>
<p>1. Нека разгледаме следният елементарен уебсайт:</p>
<p><em>index.php:</em></p>
<pre>&lt;?php
	if (isset($_GET['page'])){
		if ($handle = @fopen($_GET['page'], "r")){
			while (!feof($handle)) {
				$line = fgets($handle);
				echo $line;
			}
			fclose($handle);
			return;
		}
		else{
			echo '404 Not Found';
			return;
		}
	}
?&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom code injection page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	This is the index page.&lt;br&gt;&lt;br&gt;
	1. &lt;a href="index.php?page=products.html"&gt;products&lt;/a&gt;&lt;br&gt;
	2. &lt;a href="index.php?page=contacts.html"&gt;contact us&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><em>products.html:</em></p>
<pre>&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom products page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	Hello, this is the products page!
&lt;/html&gt;</pre>
<p><em>contacts.html:</em></p>
<pre>&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom contact page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	Hello, this is the contacts page!
&lt;/html&gt;</pre>
<p>На пръв поглед резултатите са задоволителни &#8211; ако отворите &#8222;http://worldbank.dom/index.php&#8220; ще се отвори страницата с двете хипер връзки. Ако отворите &#8222;http://worldbank.dom/index.php?page=products.html&#8220; ще се отпечата страницата с продуктите, а като отворите &#8222;http://worldbank.dom/index.php?page=contacts.html&#8220; ще се отвори страницата за контакти. Ако пък отворим несъществуващ файл, то ще се изведе &#8222;404 Not Found&#8220;.</p>
<p>Функцията fopen обаче има функционалност, която позволява отварянето на външни ресурси. Опитайте да отворите &#8222;http://worldbank.dom/index.php?page=http://cphpvb.net&#8220; &#8211; с изненада ще видите, че ще се зареди информация от сайта, който четете в момента. Очевидно това е опасен източник за XSS атака, тъй като атакуващият може да зареди информация директно от трети източник.</p>
<p>Първото решение на проблема е да забраним allow_url_fopen в конфигурационният файл php.ini:</p>
<pre>	allow_url_fopen = on</pre>
<p>Вторият важен момент е премахването на &#8220;лошите символи&#8220; от съдържанието на променливата:</p>
<pre>&lt;?php
	if (isset($_GET['page'])){
<strong>		$badChars=array("/","\\","\"",";");
		$page=str_replace($badChars,"",$_GET['page']);
		if ($handle = @fopen($page, "r")){</strong>
			while (!feof($handle)) {
				$line = fgets($handle);
				echo $line;
			}
			fclose($handle);
			return;
		}
		else{
			echo '404 Not Found';
			return;
		}
	}
?&gt;
...</pre>
<p>Това <strong>не е</strong> правилен подход! Вече сме споменавали, че премахването на &#8222;лошите символи&#8220; не е правилен вариант за защита. По-добрият подход е за следене за валиден формат:</p>
<pre>&lt;?php
	if (isset($_GET['page'])){
<strong>		if (preg_match('/(\w+)\.html$/', $_GET['page'])){
			$page=$_GET['page'];
		}
		else{
			$page = '404.html;
		}</strong>
		if ($handle = @fopen($page, "r")){
			while (!feof($handle)) {
				$line = fgets($handle);
				echo $line;
			}
			fclose($handle);
			return;
		}
		else{
			echo '404 Not Found';
			return;
		}
	}
?&gt;
...</pre>
<p>Накрая бихме предпочели да не рискуваме въобще с отварянето на файлове от външни източници. За целта може да използваме функцията file_exists($file), която проверява дали<strong> локален файл </strong>съществува или не:</p>
<pre>&lt;?php
	if (isset($_GET['page'])){
		if (preg_match('/(\w+)\.html$/', $_GET['page'])){
			$page=$_GET['page'];
		}
		else{
			$page = '404.html;
		}
<strong>		if (file_exists($page)){
			$handle = @fopen($page, "r");</strong>
			while (!feof($handle)) {
				$line = fgets($handle);
				echo $line;
			}
			fclose($handle);
			return;
		}
		else{
			echo '404 Not Found';
			return;
		}
	}
?&gt;
...</pre>
<p>Неразумното използване на fopen() води до нежелани XSS атаки. Показаната система е валидна само ако файловете, които добавяме са в чист HTML формат. В много случаи се налага да използваме &#8222;include&#8220; за добавяне на php код от други страници. Там проблемът вече се прехвърля от XSS атака към възможност за уязвимост на самия сървър! Представете си следният код:</p>
<pre>&lt;?php
	if (isset($_GET['page'])){
		// Никога не правете това!!!
		include $_GET['page'];
	}
?&gt;</pre>
<p>Резултатът на горният код може да бъде унищожителен за вашето приложение. Имайте в предвид, че съществува конфигурационен параметър &#8222;allow_url_include&#8220;, който позволява добавянето на файлове от външни източници. Отново, както в по-горният пример, би трябвало да се погрижим да отваряме само локални файлове:</p>
<pre>&lt;?php
	if (isset($_GET['page'])){
		if (file_exists($_GET['page'])){
			include $_GET['page'];
			return;
		}
		else{
			echo '404 Not Found';
			return;
		}
	}
?&gt;</pre>
<p>Чрез този пример имаме възможност за &#8222;вмъкване&#8220; на PHP код.</p>
<p>Трябва да споменем обаче, че представената защита (забрана на външни файлове) в никакъв случай не решава всички проблеми. Дали само &#8222;вмъкването&#8220; на външни файлове води до проблеми? Дали не съществуват и локални файлове, до които ние не бихме искали да позволяваме достъп?</p>
<p>Във всички примери дотук ние можем да добавяме който и да е файл в текущата директория (напр. topsecretfile.txt, config.php, и др.), дори когато &#8222;public&#8220; правата за четене и запис до него са забранени. Дори да няма такива конфиденциални данни в текущата директория &#8211; опитайте се да отворите &#8222;http://worldbank.dom/index.php?page=index.php&#8220;. Ще се получи изключително неприятен безкраен цикъл. В допълнение &#8211; от последния пример можем да добавим не само файлове в текущата директория, а който и да е файл от локалната система, до който php процесът има права (напр. при лошо организирани права за достъп можем да прочетем и файлове от други директории, чрез пълния път до тях: /home/worldbank.dom/www/.passwd и т.н.).</p>
<p>Явно, че да правим филтриране от тип &#8222;кои файлове не трябва да се виждат&#8220; е лош подход. Значително по-добре е да направим подход &#8222;кои файлове могат да бъдат видяни&#8220;. Затова нека за финал да организираме представените по-горе примери в един значително по-защитен вид:</p>
<p>1. Сигурно добавяне на HTML код с fopen:</p>
<pre>&lt;?php
	if (isset($_GET['page'])){
<strong>		$pages=array("products.html", "contacts.html");
		if (in_array($_GET['page'], $pages)){</strong>
			if (file_exists($_GET['page'])){
				$handle = @fopen($_GET['page'], "r");
				while (!feof($handle)) {
					$line = fgets($handle);
					echo $line;
				}
				fclose($handle);
				return;
			}
			else{
				echo 'File is missing&lt;br&gt;';
				echo 'Please contact the admin';
				return;
			}
		}
		else{
			echo '404 Not Found';
			return;
		}
	}
?&gt;
...</pre>
<p>2. Сигурно добавяне на PHP код с include:</p>
<pre>&lt;?php
	if (isset($_GET['page'])){
<strong>		$pages=array("products.php", "contacts.php");
		if (in_array($_GET['page'], $pages)){</strong>
			if (file_exists($_GET['page'])){
				include $_GET['page'];
				return;
			}
			else{
				echo 'File is missing&lt;br&gt;';
				echo 'Please contact the admin';
				return;
			}
		}
		else{
			echo '404 Not Found';
			return;
		}
	}
?&gt;
...</pre>
<p>Чрез демонстрирания метод можем да сме уверени, че могат да бъдат добавени само локални файлове и то единствено тези, които са указани в масива $pages.</p>
<p>Видяхме, че атаките за вмъкване на нежелан код са значително по-комплексни отколото си представяхме. Филтрирането на входните данни не винаги е достатъчна защита. Винаги се стремете да създавате колкото се може по-рестриктивен режим на работа.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/569-code-injection-%d0%b2%d0%bc%d1%8a%d0%ba%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%bd%d0%b5%d0%b6%d0%b5%d0%bb%d0%b0%d0%bd-%d0%ba%d0%be%d0%b4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Не вярвайте на Environment Variables</title>
		<link>http://www.cphpvb.net/network-security/560-environment-variables-%d0%b7%d0%b0%d1%89%d0%be-%d0%bd%d0%b5-%d1%82%d1%80%d1%8f%d0%b1%d0%b2%d0%b0-%d0%b4%d0%b0-%d0%b8%d0%bc-%d0%b2%d1%8f%d1%80%d0%b2%d0%b0%d0%bc%d0%b5/</link>
		<comments>http://www.cphpvb.net/network-security/560-environment-variables-%d0%b7%d0%b0%d1%89%d0%be-%d0%bd%d0%b5-%d1%82%d1%80%d1%8f%d0%b1%d0%b2%d0%b0-%d0%b4%d0%b0-%d0%b8%d0%bc-%d0%b2%d1%8f%d1%80%d0%b2%d0%b0%d0%bc%d0%b5/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 22:15:48 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=560</guid>
		<description><![CDATA[На няколко пъти споменахме, че Environment Variables не трябва да бъдат използвани като достоверен източник на информация. Време е да добавим още нещо &#8211; използването им може да доведе и до пробиви в сигурността. Една статия от seancoates.com заслужава значително внимание. Трябва да отбележим, че описаното в статията е изключително честа практика при програмирането на PHP, [...]]]></description>
			<content:encoded><![CDATA[<p>На няколко пъти споменахме, че Environment Variables не трябва да бъдат използвани като достоверен източник на информация. Време е да добавим още нещо &#8211; използването им може да доведе и до пробиви в сигурността. Една <a href="http://seancoates.com/xss-woes" target="_blank">статия от seancoates.com</a> заслужава значително внимание.</p>
<p>Трябва да отбележим, че описаното в статията е изключително честа практика при програмирането на PHP, а именно &#8211; когато правите заявка от един скрипт към самия него, то програмистите използват за улеснение $_SERVER['PHP_SELF']. Тази environment променлива записва текущия локален път към скрипта. Следните форми могат да бъдат видяни в изключително много PHP приложения:<span id="more-560"></span></p>
<pre>	echo '&lt;form action="'.$_SERVER['PHP_SELF'].'"&gt;';</pre>
<p>Както вече е описано в статията по-горе, този код е уязвим от потенциална XSS атака, като просто се добавят кавички, затваряща ъглова скоба и последващ html код или javascript чрез URL (от примера в сайта &#8222;/%22%3E%3Cscript%3Ealert(&#8216;xss&#8217;)%3C/script%3E%3Cfoo&#8220;).</p>
<p>За превенция на подобни уязвимости ще повторим вече казани принципи:</p>
<p>1. Не използвайте GET за попълване на форми;</p>
<p>2. Защитавайте формите от XSRF;</p>
<p>3. Не вярвайте на environment променливите;</p>
<p>4. Третирайте environment променливи и ги филтрирайте по същия начин, както обикновените променливи.</p>
<p><strong>Задача</strong>: Потърсете open source приложения, написани на PHP, които използват несигурно PHP_SELF.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/560-environment-variables-%d0%b7%d0%b0%d1%89%d0%be-%d0%bd%d0%b5-%d1%82%d1%80%d1%8f%d0%b1%d0%b2%d0%b0-%d0%b4%d0%b0-%d0%b8%d0%bc-%d0%b2%d1%8f%d1%80%d0%b2%d0%b0%d0%bc%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Forced Browsing &#8211; лош контрол над привилегии</title>
		<link>http://www.cphpvb.net/network-security/557-forced-browsing-%d0%bb%d0%be%d1%88-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb-%d0%bd%d0%b0%d0%b4-%d0%bf%d1%80%d0%b8%d0%b2%d0%b8%d0%bb%d0%b5%d0%b3%d0%b8%d0%b8/</link>
		<comments>http://www.cphpvb.net/network-security/557-forced-browsing-%d0%bb%d0%be%d1%88-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb-%d0%bd%d0%b0%d0%b4-%d0%bf%d1%80%d0%b8%d0%b2%d0%b8%d0%bb%d0%b5%d0%b3%d0%b8%d0%b8/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 21:50:30 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=557</guid>
		<description><![CDATA[&#8222;Forced Browsing&#8220; или още &#8222;Forceful Browsing&#8220; е атака, която цели достъпване на ресурси, които би трябвало да бъдат защитени. Почти винаги причина за такава атака е лош дизайн на правата на достъп за приложението. Принципът за защита е само един &#8211; ако например искаме да автентикираме един потребител и да проверим дали е администратор или [...]]]></description>
			<content:encoded><![CDATA[<p>&#8222;Forced Browsing&#8220; или още &#8222;Forceful Browsing&#8220; е атака, която цели достъпване на ресурси, които би трябвало да бъдат защитени. Почти винаги причина за такава атака е лош дизайн на правата на достъп за приложението. Принципът за защита е само един &#8211; ако например искаме да автентикираме един потребител и да проверим дали е администратор или не, то ние НЕ трябва да разчитаме на информация подадена от него. Винаги извършвайте проверките на страната на сървъра. Следното видео демонстрира с пример ефекта от лошо управление на правата на достъп:<span id="more-557"></span><br />
<a href="http://www.virtualforge.de/vmovie/forceful_browsing/forceful_browsing.html">forceful_browsing video</a></p>
<p>Както се вижда от видеото Forced Browsing включва в себе си и един друг елемент &#8211; сканиране на приложението. Това е изключително труден за предотвратяване проблем. В никакъв случай не разчитайте на това, че атакуващия няма да влезе във вашия административен панел, понеже не знае адреса му!</p>
<p>При създаване на система с привилегии използвайте следните препоръки:</p>
<p>1. Винаги правете проверката на страната на сървъра и не разчитайте на клиента да се &#8222;самоавторизира&#8220;.</p>
<p>2. При преминаване между страници, изискващи различни права на достъп, винаги изисквайте допълнителна автентикация. Не разчитайте на предварително инициализираната сесия (тя може да е фиксирана или открадната).</p>
<p>3. Избягвайте използването на GET заявки, когато става дума за важна информация. Те са значително по-лесни за атака със скенери.</p>
<p>4. Не използвайте тривиални имена на важните файлове и раздели в системата (config.php, /admin, /logs, /system, &#8230;). Затруднете атакуващият колкото се може повече.</p>
<p>5. Въведете защити срещу brute force атаки, като блокирате атакуващите след определен брой заявки. Ще разгледаме такива техники при изследването на един по-тежък проблем &#8211; Denial Of Service атаките.</p>
<p>Ясно е, че когато използваме комерсиални приложения, то сканирането не е проблем с който трябва да се борим, защото атакуващият най-вероятно е запознат в детайли със самото приложение още преди да предприеме атака. При системи с отворен код обаче си заслужава поне да промените имената на важни директории, файлове и пътища. По този начин не решавате проблемите (дупките в сигурността остават отворени), но поне ще изолирате системата си от най-елементарните автоматизирани атаки.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/557-forced-browsing-%d0%bb%d0%be%d1%88-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb-%d0%bd%d0%b0%d0%b4-%d0%bf%d1%80%d0%b8%d0%b2%d0%b8%d0%bb%d0%b5%d0%b3%d0%b8%d0%b8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XSRF &#8211; данни от чужд източник към форма</title>
		<link>http://www.cphpvb.net/network-security/547-xsrf-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d0%be%d1%82-%d1%87%d1%83%d0%b6%d0%b4-%d0%b8%d0%b7%d1%82%d0%be%d1%87%d0%bd%d0%b8%d0%ba-%d0%ba%d1%8a%d0%bc-%d1%84%d0%be%d1%80%d0%bc%d0%b0/</link>
		<comments>http://www.cphpvb.net/network-security/547-xsrf-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d0%be%d1%82-%d1%87%d1%83%d0%b6%d0%b4-%d0%b8%d0%b7%d1%82%d0%be%d1%87%d0%bd%d0%b8%d0%ba-%d0%ba%d1%8a%d0%bc-%d1%84%d0%be%d1%80%d0%bc%d0%b0/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 20:54:44 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=547</guid>
		<description><![CDATA[&#8222;Cross Site Request Forgery&#8220; е подход, който често използва XSS уязвимост в приложението, чрез която да се достигане компрометиране на самото приложение. Обикновено се използва потребител, на който приложението има &#8222;доверие&#8220; (например такъв с административни права). Обикновено атакуващият, като обикновен потребител, не би могъл сам да предизвика желания резултат и поради тази причина използва XSS [...]]]></description>
			<content:encoded><![CDATA[<p>&#8222;Cross Site Request Forgery&#8220; е подход, който често използва XSS уязвимост в приложението, чрез която да се достигане компрометиране на самото приложение. Обикновено се използва потребител, на който приложението има &#8222;доверие&#8220; (например такъв с административни права). Обикновено атакуващият, като обикновен потребител, не би могъл сам да предизвика желания резултат и поради тази причина използва XSS уязвимост за изпълнение на заявка чрез друг потребител (с по-високи права). Следното видео демонстрира това:<span id="more-547"></span><br />
<a href="http://www.virtualforge.de/vmovie/xsrf/xsrf_attacked.html">xsrf демонстрация</a> &#8211; изпълнение на скриптове чрез различни форми на дадено приложение.</p>
<p>Като един от най-големите осъществени пробиви ще споменем, че почти 18 милиона потребители са загубили лична информация през февруари 2008 от пробив в корейският eBay (информация от webappsec.org).</p>
<p>Остава въпросът &#8211; дали ако се защитим от всички XSS атаки, то ще бъдем защитени и от XRSF атаки? Не бихме се обвързали с потвърдителен отговор на този въпрос. Сега обаче ще демонстрираме един метод за защита на форми, чрез който можем ефективно да предотвратяваме XSRF атаки. Нека разгледаме следната примерна форма:</p>
<pre>&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom XSRF vulnerable page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
	if( isset($_REQUEST['submit'])){
		echo 'Form is submitted';
	}
	else {
		echo '&lt;form action="xsrf.php" method="POST"&gt;';
		echo '&lt;input type="submit" name="submit"&gt;';
		echo '&lt;/form&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';
	}
?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Предполагаме, че този пример няма нужда от разяснения. Нека приемем, че той е качен на адрес worldbank.dom/xss.php. Когато отворите адреса в браузера и натиснете бутона, то ще се изпълни кода показващ &#8222;Form is submitted&#8220; на екрана.</p>
<p>HTML формите обаче имат едно свойство, че не проверяват източника на подаване на информацията. Направете следния опит &#8211; напишете следния html файл и го изпълнете от собствения си компютър:</p>
<pre>&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;XSS attacker&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	<strong>&lt;form action="http://worldbank.dom/xsrf.php" method="POST"&gt;</strong>
	&lt;input type="submit" name="submit"&gt;
	&lt;/form&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Пуснете файла на личния си компютър и натиснете бутона. Ще изпратите POST информацията към worldbank.dom сървъра и ще попълните формата. Това очевидно не би трябвало да се случва &#8211; проверката на формата на сървъра би трябвало да очаква информацията към нея да бъде попълнена от сигурен източник. Как може да се уверим, че информацията е изпратена от самата форма?</p>
<p>Може би най-ефективният вариант е чрез използване на потребителска сесия. Като скрито поле вътре във формата трябва да запишем произволно генерирано число. Това число се записва и в потребителската сесия . Когато скрипта получи заявка, той трябва да сравни числото предадено чрез $_POST и да го сравни с това, записано в $_SESSION. Ето как бихме реализирали това с горния скрипт:</p>
<pre>&lt;?php
	function security_start_session($ssl, $timeout, $maxtime, $ip){
		// ... security checks
		session_start();
		session_regenerate_id(true);
		return 1;
	}
	if (security_start_session(0, 6*60, 20*60, 1) != 1){
		echo "&lt;br&gt;session destroyed!";
		return;
	}
?&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom XSRF protected page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
	if( isset($_REQUEST['submit'])){
<strong>		if ($_SESSION['token']!=$_POST['token'] || !isset($_SESSION['token']) || !isset($_POST['token'])){
			session_unset();
			session_destroy();
			echo "Invalid session&lt;/body&gt;&lt;/html&gt;";
			return;
		}</strong>
		else{
			echo 'Form is submitted';
		}
	}
	else{
		echo '&lt;form action="xsrf.php" method="POST"&gt;';
<strong>		$_SESSION['token'] = uniqid(rand(), true);
		echo '&lt;input type="hidden" name="token" value="'.$_SESSION['token'].'"&gt;';</strong>
		echo '&lt;input type="submit" name="submit"&gt;';
		echo '&lt;/form&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';
	}
?&gt;
&lt;/body&gt;&lt;/html&gt;</pre>
<p>Тук обезателно се налага стартирането на потребителска сесия (което тъй или иначе се прави в повечето случаи). Обърнете внимание на удебелените линии, където се генерира случайният token. Чрез него сме сигурни, че формата е попълнена именно от нашият сървър.</p>
<p>Другият често използван подход е проверката на &#8222;HTTP referer&#8220;. За PHP това става чрез environment променливата, записана като &#8222;$_SERVER['HTTP_REFERER']&#8222;. В нея се записва информацията откъде е дошла заявката. Вече споменахме, че тези HTTP header променливи не са надежден носител на данни (може да се направи spoof над тях). Въпреки това не можем да пуснем една такава допълнителна защита:</p>
<pre>&lt;?php
	function security_start_session($ssl, $timeout, $maxtime, $ip){
		// ... security checks
		session_start();
		session_regenerate_id(true);
		return 1;
	}
	if (security_start_session(0, 6*60, 20*60, 1) != 1){
		echo "&lt;br&gt;session destroyed!";
		return;
	}
?&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom XSRF protected page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
	if( isset($_REQUEST['submit'])){
		if ($_SESSION['token']!=$_POST['token'] || !isset($_SESSION['token']) || !isset($_POST['token'])){
			session_unset();
			session_destroy();
			echo "Invalid session&lt;/body&gt;&lt;/html&gt;";
			return;
		}
		else{
<strong>			if (isset($_SERVER['HTTP_REFERER']) &amp;&amp; $_SERVER['HTTP_REFERER']!="http://worldbank.dom/xsrf.php"){
				echo 'You are redirected by third party form - probably you are a XSRF attack victim!';
				return;
			}</strong>
			else{
				echo 'Form is submitted';
			}
		}
	}
	else{
		echo '&lt;form action="xsrf.php" method="POST"&gt;';
		$_SESSION['token'] = uniqid(rand(), true);
		echo '&lt;input type="hidden" name="token" value="'.$_SESSION['token'].'"&gt;';
		echo '&lt;input type="submit" name="submit"&gt;';
		echo '&lt;/form&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';
	}
?&gt;
&lt;/body&gt;&lt;/html&gt;</pre>
<p>Имайте обаче в предвид, че сравнението по HTTP_REFERER header може да пропадне при някои proxy сървъри или ако клиента има строги настройки на своята защитна стена или антивирусна програма. Поради тази причина би трябвало да използвате тази допълнителна защита само при системи със конфиденциална информация (където едва ли очакваме анонимни потребители).</p>
<p>XSRF е проблем често срещан в приложения, които позволяват на потребителите си да &#8222;вмъкват&#8220; външни ресурси в системата. Това е често срещано при форуми, където потребителите могат да избират avatar от външен адрес, да вкарват снимки или видео клипове в своите posts. Проблемът с XSS там се решава лесно, като се забранят HTML символите, а вместо това се разреши единствено BBCode. За XSRF обаче решението не е толкова лесно.</p>
<p><strong>Задача</strong>: Помислете как можете да реализирате ефективен филтър, който да разпознава дали URL, който трябва да сочи към картинка, не е всъщност връзка към скрипт.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/547-xsrf-%d0%b4%d0%b0%d0%bd%d0%bd%d0%b8-%d0%be%d1%82-%d1%87%d1%83%d0%b6%d0%b4-%d0%b8%d0%b7%d1%82%d0%be%d1%87%d0%bd%d0%b8%d0%ba-%d0%ba%d1%8a%d0%bc-%d1%84%d0%be%d1%80%d0%bc%d0%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>XSS &#8211; вмъкване на нежелан код</title>
		<link>http://www.cphpvb.net/network-security/543-xss-%d0%b2%d0%bc%d1%8a%d0%ba%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%bd%d0%b5%d0%b6%d0%b5%d0%bb%d0%b0%d0%bd-%d0%ba%d0%be%d0%b4/</link>
		<comments>http://www.cphpvb.net/network-security/543-xss-%d0%b2%d0%bc%d1%8a%d0%ba%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%bd%d0%b5%d0%b6%d0%b5%d0%bb%d0%b0%d0%bd-%d0%ba%d0%be%d0%b4/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 15:48:04 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=543</guid>
		<description><![CDATA[Cross Site Scripting (XSS) е атака, която използва уязвимост на приложението и &#8220;вмъква&#8220; нежелан код, който се изпълнява в браузъра на крайния потребител. Най-общо казано атаката цели да намери място в програмата, в което се отпечатва стойността на дадена променлива и не се проверява коректно нейното съдържание. Обикновено в съдържанието на променливата се записва HTML, XHTML, JavaScript, ActiveX, VBScript, Flash, [...]]]></description>
			<content:encoded><![CDATA[<p>Cross Site Scripting (XSS) е атака, която използва уязвимост на приложението и &#8220;вмъква&#8220; нежелан код, който се изпълнява в браузъра на крайния потребител. Най-общо казано атаката цели да намери място в програмата, в което се отпечатва стойността на дадена променлива и не се проверява коректно нейното съдържание. Обикновено в съдържанието на променливата се записва HTML, XHTML, JavaScript, ActiveX, VBScript, Flash, и др видове изпълним код. Възможностите за цел на атаката може да са много &#8211; придобиване на достъп до защитена зона на сайта (чрез постигане на session hijacking), подвеждане на потребителя да въведе информация към трети източник (physhing), инсталиране на нежелани програми на компютъра на потребителя (virus, worm, trojan, &#8230;), и др. Според изследване на Symantec около 80% от проблемите в сигурността на уеб-базираните приложения са свързани именно с XSS уязвимости. Също така се прави статистическо предположение, че поне 70% от динамичните уеб-сайтове в световната мрежа притежават такава уязвимост. Обикновено крайния потребител не може да намери визуален белег, по който да разкрие атаката.<span id="more-543"></span></p>
<p>XSS атаките са най-общо три вида:<br />
1. Директни: Атакуващият предоставя връзка или друг вид &#8222;маскиран&#8220; код към клиента. Когато клиента последва такава връзка той попада на оригиналният уебсайт на дадената услуга, но вече с модифициран от атакуващия код. Възможно е и възползването от уязвимост на софтуера, с който жертвата преглежда подаденото му съобщение, с цел атакуващия да добие достъп до неговата административна част. Директните атаки се реализират най-често чрез изпращане на писма по електронната поща към жертвата или чрез съобщения в различни чат приложения.<br />
2. Статични: Атакуващият успява да вмъкне нежелания код в база данни и само изчаква жертвата сама да отвори уязвимата страница. Това са най-честите атаки при т.нар. социални мрежи &#8211; форуми, блогове, дискусионни групи, и т.н.<br />
3. DOM: Това са XSS атаки от т.нар. локално ниво. Обикновено се използва уязвимост в скрипт на продукта, чрез който самият софтуер да предизвика директна XSS атака към жертвата.</p>
<p>Почти няма приложение в Интернет, което да няма или да не е имало XSS уязвимост. В днешно време, с навлизането на все повече технологии като Action Script на Flash или AJAX скриптовете, XSS атаките все повече добиват популярност. На практика всички тези проблеми се зараждат в момента, когато сървърите придобиват функционалност за директно изпълнение на код при клиента (напр. JavaScript).</p>
<p>Нека като пример да разгледаме следната елементарна форма:</p>
<pre>&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom XSS vulnerable page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
	echo '&lt;form action="xss.php" method="POST"&gt;';
	echo 'data:';
	echo '&lt;input type="text" name="data"&gt;';
	echo '&lt;br&gt;&lt;input type="submit" name="submit"&gt;';
	echo '&lt;/form&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';
	if( isset($_REQUEST['submit'])){
		<strong>echo $_REQUEST['data'];</strong>
	}
	else {
		echo 'Type something';
	}
?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Удебеленият ред &#8222;echo $_REQUEST['data']&#8220; демонстрира XSS уязвимост. Очевидно ние отпечатваме на екрана директно всичко, което е въведено от формата, без да правим никакви проверки. Въведете обикновен текст (например думата &#8222;test&#8220;) и тествайте приложението. Нищо не подсказва, че има проблем. Следващият път въведете някакъв изпълним код, например:</p>
<pre>	test&lt;Script language='JavaScript'&gt;alert("XSS HACK")&lt;/Script&gt;</pre>
<p>Отново ще се отпечата думата &#8222;test&#8220;, но вече ще имаме и изпълнен java script, което определено не е желано!</p>
<p>Първото нещо, което привлича вниманието (но не е непременно свързано с XSS атака), е използването на $_REQUEST, вместо $_POST. Много програмисти обичат да смесват използването на POST с GET заявки и за улеснение използват общият $_REQUEST масив. Това е първа и много основна грешка, която не трябва да се допуска! Опитайте се да отворите следния адрес:</p>
<pre>	http://worldbank.dom/xss.php?data=test&amp;submit=1</pre>
<p>Ще забележите, че все едно сме въвели текст във формата, а ние все още не сме го направили. Затова избягвайте програмна логика, използваща $_REQUEST.</p>
<p>Сега да се фокусираме върху самата XSS атака. Първата стъпка е да забраним извеждането на какъвто и да е HTML код на екрана на потребителя. Първият подход е да използваме готови функции на езиците за програмиране. Например в PHP съществува функция htmlentities, която подменя всички специални HTML символи с техни еквиваленти за отпечатване на екрана (например &#8216;&lt;&#8217; се заменя с &#8216;&amp;lt;&#8217;):</p>
<pre>&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;WorldBank.dom XSS vulnerable page&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
	echo '&lt;form action="xss.php" method="POST"&gt;';
	echo 'data:';
	echo '&lt;input type="text" name="data"&gt;';
	echo '&lt;br&gt;&lt;input type="submit" name="submit"';
	echo '&lt;/form&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;';
	if( isset($_POST['submit'])){
		<strong>$data = htmlentities($_POST['data'], ENT_QUOTES, 'UTF-8');
		echo $data;</strong>
	}
	else {
		echo 'Type something';
	}
?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Опитайте отново XSS атаката описана по-горе. Ще забележите, че тя няма вече да работи.</p>
<p>Вторият подход е да направим стриктно филтриране, както беше демонстрирано с regular expressions в статията за препълване на буфери. Опитайте &#8211; напишете горния пример така, че да позволява въвеждането само на букви (a-z, A-Z) и цифри. Комбиниран подход между тези два естествено е най-правилното решение!</p>
<p>Така дотук изведохме две основни правила &#8211; не приемайте нефилтрирани данни и не отпечатвайте нефилтрирани данни. За съжаление уеб сайтовете разчитат изключително много на визуализация на информацията и затова процеса на защита срещу XSS атаки става изключително тежък за реализиране.</p>
<p>Предлагаме ви да разгледате и следните анимации, в които се демонстрират различни видове рискове от XSS атаки:<br />
<a href="http://www.virtualforge.de/vmovie/xss_lesson_1/xss_selling_platform_v1.0.html">xss демонстрация 1</a> &#8211; крадене на cookie на друг потребител чрез статична атака.<br />
<a href="http://www.virtualforge.de/vmovie/xss_lesson_2/xss_selling_platform_v2.0.html">xss демонстрация 2</a> &#8211; придобиване на административна информация от сървъра чрез статична атака.</p>
<p>Видяхме, че XSS атаките използват уязвимост в приложението, което цели да компрометира потребителя. В следващата статия ще разгледаме подобен подход с обратно действие &#8211; Cross Site Request Forgery (XSRF).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/543-xss-%d0%b2%d0%bc%d1%8a%d0%ba%d0%b2%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-%d0%bd%d0%b5%d0%b6%d0%b5%d0%bb%d0%b0%d0%bd-%d0%ba%d0%be%d0%b4/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Secure Socket Layer (SSL)</title>
		<link>http://www.cphpvb.net/network-security/413-secure-socket-layer-ssl/</link>
		<comments>http://www.cphpvb.net/network-security/413-secure-socket-layer-ssl/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 08:25:01 +0000</pubDate>
		<dc:creator>Филип Петров</dc:creator>
				<category><![CDATA[ПТСК]]></category>

		<guid isPermaLink="false">http://www.cphpvb.net/?p=413</guid>
		<description><![CDATA[Досега силно препоръчвахме употребата на SSL, но не дадохме конкретна информация как точно ще бъде защитена нашата комуникация с него. SSL e съкращение на &#8222;Secure Socket Layer&#8220; и се използва изключително широко при криптиране на мрежови трафик. Най-често се използва при world wide web за криптиране на HTTP, но вече много често може да бъде [...]]]></description>
			<content:encoded><![CDATA[<p>Досега силно препоръчвахме употребата на SSL, но не дадохме конкретна информация как точно ще бъде защитена нашата комуникация с него. SSL e съкращение на &#8222;Secure Socket Layer&#8220; и се използва изключително широко при криптиране на мрежови трафик. Най-често се използва при world wide web за криптиране на HTTP, но вече много често може да бъде видян и при други протоколи, като FTP, SMTP, NNTP, POP3, IMAP и т.н.<span id="more-413"></span></p>
<p><strong>1. История</strong>: SSL започва своето развитие с версия 1.0, разработена от Netscape през 1993. Тя никога не излиза за публичен достъп, тъй като още в процеса на разработка са открити множество пробиви в сигурността.</p>
<p>През 1994г. се появява втората версия SSL 2.0. За нещастие много бързо са открити редица пробиви в сигурността, като:<br />
- Слаби кодове за автентикация;<br />
- Методи за насочване на двете страни да използват по-слаб алгоритъм за криптиране;<br />
- Липса на защита по време на &#8222;договарянето&#8220;;<br />
- Множество други атаки.</p>
<p>През 1995г. Microsoft правят опит за внедряване на тяхна алтернатива &#8211; PCT. Не придобива широка популярност, но все още съществува като стандарт.</p>
<p>През 1996г. отново Netscape изваждат най-популярният и най-широко използван досега стандарт SSL 3.0. В момента почти всички уеб сървъри, подържащи https криптиран канал за комуникация, поддържат SSL 3.0.</p>
<p>През 1999г. излиза TLS (Transport Layer Security) &#8211; още известен като SSL 3.1. Това всъщност е обединение на SSL и PCT (тоест може да работи и с двата стандарта). Този протокол добавя и подобрения в сигурността над SSL 3.0, но те засега са само препоръчителни, тъй като TLS е напълно съвместим със &#8222;стари&#8220; клиенти, използващи SSL 3.0.</p>
<p><strong>2. Принцип на действие</strong>: Вече обяснихме проблема с подслушването на трафик. Всяка една мрежа е застрашена от злонамерени хора, целящи да откраднат информация. И така &#8211; как SSL решава този проблем?</p>
<p>SSL основно се базира на идеята за криптиране чрез публичен и частен ключ. В началото, при установяването на връзката, двете страни на комуникацията си разменят своите &#8222;сертификати&#8220;. Те съдържат в себе си публичните ключове и допълнителна информация, за която ще говорим по-долу. При по-нататъшна комуникация всяка от страните изпраща информацията си кодирана чрез публичния ключ на другата страна. Информацията, кодирана с такъв публичен ключ, може да бъде декодирана единствено използвайки съответветващия му частен ключ. Тъй като частните ключове остават невидими за подслушващия трафика, то той не може да дешифрира тази информация.</p>
<p>За нещастие самият процес на криптиране не е единствения проблем, с който се сблъскваме в реално време. Чрез криптография ние наистина сме изолирали подслушващите трафика, но не сме решили проблема с &#8222;подменящите&#8220; трафика (т.е. когато стои &#8222;човек по средата&#8220; на комуникацията &#8211; пред клиента се представя за сървър, а пред сървъра за клиент). Тези атаки биха били успешни, ако няма начин за удостоверяване на автентичността на сертификата (атакуващият просто предава своя публичен ключ и на двете страни и използва своя частен за дешифриране на целия трафик):</p>
<p style="text-align: center;">Клиент &lt;&#8212;&gt; Атакуващ &lt;&#8212;&gt; Сървър</p>
<p>Очевидна е нуждата от удостоверение за автентичност на сертификат. За щастие SSL се справя с този проблем, като в сертификата се записва и ключа на т.нар. &#8222;CA&#8220; (съкратено от Certificate Authority). Всеки сертификат се издава за даден уебсайт (на строго определен статичен IP адрес) от някоя трета страна, наречена CA. В публичният интернет това са организации като Verisign, Comodo, Geotrust, Globalsign и др. При локални мрежи това може да е централният сървър или компютъра на системия администратор. CA одобрява сертификатът на сървъра, като специално указват за кой hostname е издаден. Ето например сертификата на Google:</p>
<div id="attachment_535" class="wp-caption aligncenter" style="width: 523px"><img class="size-full wp-image-535" title="SSL Сертификат на Google" src="http://www.cphpvb.net/wp-content/uploads/2008/12/ssl.png" alt="SSL Сертификат на Google" width="513" height="593" /><p class="wp-caption-text">SSL Сертификат на Google</p></div>
<p>Ако сървър се опита да предложи сертификат, който не е с одобрен hostname то ще бъде изведена грешка в браузъра на клиента. Още повече &#8211; дори ако легитимния сървър смени своя IP адрес, то отново сертификатът ще стане невалиден. Валидацията по хост и IP при CA се счита за достатъчно добра защита. Както казахме при използване на &#8222;невалиден&#8220; сертификат в браузъра на клиента излиза съобщение за грешка. Той обаче все пак има възможност да продължи на своя отговорност. Ето един пример:</p>
<div id="attachment_537" class="wp-caption aligncenter" style="width: 544px"><img class="size-full wp-image-537" title="Използва чужд сертификат" src="http://www.cphpvb.net/wp-content/uploads/2008/12/sslerror.png" alt="Използва чужд сертификат" width="534" height="513" /><p class="wp-caption-text">Използва чужд сертификат</p></div>
<p>Публичните сертификати от Verisign, Comodo, и т.н. сравнително скъпа услуга. Обикновено малките уеб сайтове, предлагащи безплатни услуги (както например моят cphpvb.net) не могат да си позволят закупуването на такъв сертификат (света все пак се върти от бизнеса). Браузъра на клиента ще приеме за валиден само сертификат, който е верифициран от един от т.нар. root сертификати (тези на големите CA). Ако ние сами издадем сертификат за себе си (например чрез втори наш сайт, който да се яви като CA), ще е нужно да накараме всичките си клиенти да вкарат нашия CA сертификат като &#8222;trusted&#8220; в своя браузър. В Интернет среда това е нереалистично. За локалните мрежи обаче това е честа практика &#8211; както споменахме просто една от машините в мрежата става CA и чрез нейният сертификат се валидира криптираната информация в мрежата. Използвайки domain controller можем лесно да накараме клиентите да приемат нашия сертификат за един от т.нар. &#8222;root&#8220; сертификати.</p>
<p><strong>3. Проблеми с SSL</strong>:</p>
<p>а) Понижаването на версия: Преди няколко години беше често явление сървъра да поддържа едновременно SSL 3.0 и SSL 2.0, с цел да донесе обратна съвместимост с по-стари браузъри. Това веднага можем да приемем като пробив в сигурността, тъй като атакуващият може да накара двете страни да се &#8222;споразумеят&#8220; да използват по-старата версия. След това, подслушвайки трафика им, той ще може да използва уязвимостите в по-стария протокол.</p>
<p>б) Отново с цел обратна съвместимост се срещат сървъри, които поддържат слабо криптиране (56 или по-малко битове). Такова криптиране с днешната техника може да бъде дешифрирано с brute force атака за няколко дни. При използването на 128 или по-високо ниво можем все още да се чувстваме сравнително спокойни.</p>
<p>в) Използването на ненадеждни hash алгоритми е един също възможен проблем. Тъй като md5 и ssh1 са достатъчно популярни стандарти, вие можете да изключите всички по-малко надеждни алгоритми за вашия сървър.</p>
<p>г) Пренасочване към некриптиран канал, ако &#8222;споразумението&#8220; между страните пропадне &#8211; това е най-често срещания проблем, който на практика обезсмисля всякаква защита. Ако една услуга трябва да бъде криптирана, то никога не я пускайте през некриптиран канал!</p>
<p>д) Всеки сертификат има срок на валидност. По предтекст, че има минимален период от време за който можем да приемем, че една brute force атака би намерила нашия частен ключ, големите CA ни взимат парите за подновяване на двойката публичен/частен ключ. Това всъщност е един доста реален аргумент &#8211; би било хубаво да подменяме сертификатите си колкото се може по-често. Изтеклите сертификати довеждат до съобщения за грешки, много подобни на тези на напълно невалидните сертификати. По този начин клиентите започват да свикват с тях и няма да обърнат внимание ако съобщението за грешка се смени (атакуващият е застанал по средата). Подновявайте сертификатите си!</p>
<p>е) Уязвимост при машината на клиента може да доведе до презаписване на неговия публичен/частен ключ или добавянето на невалиден root CA в браузъра му. Тук протокола SSL е безсилен, а и не би трябвало да му влиза в работата да следи за чужди грешки.</p>
<p>ж) Вече споменахме за проблемите при прехвърляне на session ID през некриптиран канал. Надяваме се, че ги помните. SSL няма да ви помогне при наличие на session fixation или session hijacking.</p>
<p>и) Всеки пробив в сигурността, при който частен ключ бъде видян от чужда машина, е фатален.</p>
<p>й) Възможно е използването на статистически методи за намиране на често срещани думи при прехвърлянето на информация. Такъв е например низа &#8222;GET / HTTP/1.0&#8243;, предаван от клиент към сървър. Очевидно е, че той ще бъде прехвърлян всеки път криптиран по един и същи начин. Прихващайки тази информация атакуващият е улеснен в опитите си с brute force атака, тъй като вече знае какъв резултат трябва да очаква при дешифриране на дадения низ. Засега SSL и TLS не решават този проблем.</p>
<p>В разгледаният вариант за комуникация може би сте забелязали, че само една от страните на комуникацията е защитена от CA &#8211; това е сървърът. При тази комуникация сертификатът на клиента не се автентикира за достоверност. Възможна е естествено и комуникация между две валидиращи се взаимно страни (обикновено това е комуникация между два сървъра).</p>
<p><strong>4. Процедура за регистриране на SSL сертификат</strong>:</p>
<p>За да регистрирате SSL сертификат е нужно първо да генерирате CSR (certificate signing request). Той включва следните данни:<br />
- Common Name: hostname, за който искате сертификат;<br />
- Organisation: име на вашата фирма (сертификатите се предполага, че се използва от фирми);<br />
- Organisation Unit: отдел на вашата фирма, например &#8222;support&#8220;, &#8222;marketing&#8220;, &#8230;;<br />
- City: град, в който е регистрирана вашата фирма;<br />
- Region: щат или област, в която е регистрирана фирмата;<br />
- Country: държава;<br />
- E-mail: адрес за връзка с вашата фирма.</p>
<p>Самият CSR се изпраща в криптиран вид към CA. Допълнително трябва да представите и информация за типа на вашия сървър, например apache mod_ssl, openssl, internet information server, и т.н. В замяна вие ще получите три файла &#8211; ca.crt, domain.crt и domain.key. Двата crt файла са съответно публичния ключ на CA и вашият собствен публичен ключ. Файлът завършващ с разширение key е вашият частен ключ (който трябва да бъде пазен със всички възможни средства). Следвайте инструкциите на сървъра, който използвате за да настроите вашия SSL сертификат.</p>
<p><strong>5. Passphrase:</strong></p>
<p>Passphrase е нещо като парола, защитаваща вашия частен ключ, така че той да не може да бъде използван ако бъде откраднат (eдин вид криптиране на частния ключ). Ползата от използването на passphrase е спорна, защото повечето хора приемат, че ако някой успее да пробие вашата система дотам, че да открадне частния ключ, то той би имал достъп и до процеса на web сървъра. Тъй като web сървъра трябва да &#8222;знае&#8220; passphrase, тъй като той използва частния ключ, то атакуващия тъй или иначе има достъп до желаната информация. Въпреки това считаме, че passphrase е ценно допълнение към защитата на системата. За съжаление има един голям недостатък, поради който почти никъде не е добил популярност &#8211; при всяко стартиране/рестартиране на сървъра вие трябва да въвеждате тази парола. Затова passphrase се използва само със системи, които са под постоянно наблюдение.</p>
<p><strong>Задача</strong>: Националният осигурителен институт към момента (Декември 2008) не криптира данните при проверка на здравно осигурителен статус по ЕГН (healthinsurance.nssi.bg). Потърсете други представителни български институции, при които се предава конфиденциална информация и е възможно подслушването на трафик.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cphpvb.net/network-security/413-secure-socket-layer-ssl/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

