Во-первых, сервер работает в одном потоке и не может использовать больше одного ядра. Да, можно написать аддоны, которые будут создавать потоки, может даже процессы и выносить туда свою логику, но речь идет о базовом функционале сервера, пока что он не распараллелен. Во-вторых, исследуя траффик общения сервера и клиента игры Left 4 Dead 2, удалось выявить особый и, разумеется, недокументированный тип запроса. Он предназначен для отображения списка серверов в главном меню и пакеты такого запроса содержат номер версии игры и текст InetSearchServerDetails. Стоит сказать, что для этого типа пакетов сервер уже реализует анти-ддос защиту: проверяет версию и следит за числом pps. Но ситуация усугубляется тем, что для данного типа запросов нет никакого мастер-сервера. Точнее он есть, и возвращает лишь список серверов которые привязаны к Steam-группам в которых ты состоишь. И при получении такого списка клиент сразу же шлет INET_SEARCH-пакеты всем серверам. Тем не менее, даже с кэшированием сервер тратит драгоценное время на проверку запроса и отправку ответа. Забегая вперед скажу, что полностью сняв с сервера эту обязанность мне удалось снизить задержки в игре (пинг) в 2, а то и 3 раза. Решение достаточно простое: сервер не должен отвечать на все эти запросы. Вообще. Эту задачу можно попробовать переложить на плечи какой-нибудь службы, которая бы отвечала на весь этот флуд, изредка запрашивала актуальные данные с основного сервера, а ОСь бы грамотно распределяла ресурсы. Но как отделить пакеты запросов инфы, от обычного обмена данными с сервером? Первой попыткой было использовать statefull firewall. Это обычный знакомый нам фаерволл, который следит за подключениями, может их маркеровать и тд. Не получилось. Вот так просто. Даже поймав пакет и отправив его куда надо (сторонней службе), фаерволл пометит соединение и все что придет с пары ip:port на пару ip:port будет отправлено туда же. PS: Многие просто не смогут подключиться, так как клиент как правило использует тот же сокет для обмена данными, что и для запроса информации. stateless firewall я даже не ковырял, и как я потом понял - он мне бы и не подошел. Остался самый очевидный и как следствие - простой - способ отделить один пакет и направить куда надо. Это модуль ядра. И это сработало! Я зарегистрировал обработчик пакетов самым первым (там можно выставлять приоритет), еще пока он обрабатывается в пределах RAW таблицы и никто его в глаза не видел. Нагло подменяю порт отправки, пересчитываю контрольную сумму и пропускаю его дальше! А дальше он проходит через воду, огонь и медные трубы и попадает прямо к службе, которая слушает нужный порт. Ответы от службы обратно транслируются и порт подменяется при отправлении. Для простоты и удобства порты имеют жесткую связку: 27015 -> 27915 27016 -> 27916 ... В итоге, все запросы приходящие на нужные порты в соответствии с правилами направляются к службе, которая знает на какой порт для какого сервера идет запрос. Службу я написал на языке Python, запросы обрабатывает асинхронно и работает очень шустро. Соответствия портов лежат в конфиге, ну а в модуле ядра они зашиты. Перспектив для развития достаточно много, можно отвечать не всем, проще управлять лимитами, детектировать атаки и собирать разного рода статистику. В общем, все что душе угодно. И главное - всё это не будет отнимать процессорного времени у сервера (игрового).
Хотелось бы сказать "по долгу службы", ан нет. Не в столь отдаленном прошлом необходимо было решить проблему с "DDoS". Это была не спланированная атака, никто не хотел причинить вред или что-то подобное. Нет. Просто слишком много людей хотело спросить сервер о его состоянии, но обо всем по порядку. Речь идет о source-based серверах (игровых, на движке Source). При запуске такой сервер отправляет информацию о себе мастер-серверу, и уже с мастер-серевером происходит всё общение клиентов: получение списка серверов и базовая информация. Подробная инфофрмация будет запрошена напрямую. Такое общение происходит по спец. протоколу, который описан тут https://developer.valvesoftware.com/wiki/Server_queries и тут https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol Атаковать сервер не так уж сложно, достаточно начать флудить запросами, а если еще провайдер позволяет ip-spoofing и на другой стороне нет даже rp-фильтра, то дело за малым. Проблему люди быстро научились решать кэшированием: https://forums.alliedmods.net/showthread.php?t=135543 Кэшируют конечно не всё, но ситуация стала определенно лучше. Проблема же кроется в другом, а для Left 4 Dead 2 их целых две.
ссылке на исходники ошибка 503
Вот M$ выложили исходники DOS'а. Правда только DOS 2.0 и по SharedPreferences settings = getSharedPreferences(ИМЯ_РЁК, 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("silentMode", mSilentMode); editor.commit(); //Работает. Запоминает. settings.edit().putBoolean("silentMode", mSilentMode); settings.edit().commit(); //Не работает. Не запоминает. //Очевидно, почему так? Мне вот не сразу стало понятно. И возможность и реализацию второго варианта я бы // обсудил //PS: ушёл искать реализацию http://is.gd/NgQL0g
t.co >> Весьма интересное и неопределённое положение. Я считаю, Libre нужно присоединится к oo и не пороть горячку. OO всё же раскручен уже.
*мысли Мои переводы новостей мира IT: Лицензии Office. Будущее проектов OpenOffice и LibreOffice / touch every single page in the space to force it to be mapped. /
for (count = 0; count < bytes; count += 0x1000) {
volatile int temp = addr[count];
}
#endif
Filed under: (in)secure — code, how to, research — custom | Tags: $http_get_vars, $http_post_vars, $_cookie, $_GET, $_post, $_request, $_server, $_session, audit, exec, header location, include, include_once, passthru, proc_open, readfile, require, require_once, shell_exec, source code, system, virtual |
What source code audit is?
It’s a primary technique by which someone can find vulnerabilities of the website, just by inspecting the code.
Consider the following scenarios:
find a ftp service exploit and you can download the entire website in it’s unparsed form
have the source of the web application used by the website
What has to be done?
Instead of emulating the real website (setting up a webserver, database, etc) you can just start and analyze the code for common known vulnerable code.
User input
Most of the time user input is passed to the web application via requests, like:
—
$_GET
$_POST
$_REQUEST
$HTTP_POST_VARS
$HTTP_GET_VARS
—
And if register globals in php.ini are activated, user input can be retrieved via <input> names, for example the following html form:
—
<form name=”basic” method=”post” action=”">
<input type=”text” name=”myname”>
<input type=”text” name=”age”>
<input type=”submit” value=”age & name”<
</form>
—
…would create and set the following variables:
—
$myname=”user input”;
$age=”user input”
—
This request should be always searched for input validation, or xss/sql injection possibility.
Internal inclusion
As imagined I’m talking about file inclusion which could lead to lfi/rfi; the php functions that need to be exploited for a lfi/rfi attack are:
—
include()
include_once()
require()
require_once()
virtual()
readfile()
—
Not much to check here, only the parameters origins, validation…
Indirect User Input
Indirect user input? That sounds wierd, but don’t get confused about it; I’m speaking about user-agent information, http referer, cookie reading/writing/printing, session?. The all together could lead to xss/sql injection/http response splitting and why not (remote) code execution/file inclusion. Things to look for:
—
$_SERVER["REFERER"];
$_SERVER["HTTP_USER_AGENT"]
$_SERVER["REQUEST_URI"]
$_COOKIE
$_SESSION
—
Also here a non used Referer would mean CSRF ways of exploitation, keep that in mind; might come handy!
Redirections
Maybe you are not aware of this but after each header redirection there should be a script termination like exit() die(), so the following code would be vulnerable:
—
if($password!=$pass) { header(“Location: noadmin.php”); }
—
Because if the page would be requested via a telnet connection (for example) which wouldn’t understand header information, would skip the redirection phase and see the rest of the page.
Remote code execution
We already mentioned about remote code execution, but it would be better to also note the functions which should be look upon for code execution:
—
exec()
passthru()
proc_open()
shell_exec()
system()
—
The rest, the ugly, the not so common
Besides of the above mentioned vulnerabilities, which are more common, you could also check image upload scripts for proper type/extension validation, and every other shit that I can’t think of….
Go and analyze source code
I pointed out everything that you need to know before auditing PHP code, but if you think I missed something out, don’t bother thinking about it, just drop me a comment…
(http://insanesecurity.wordpress.com)