Pull to refresh

Comments 121

Русское слово «Вирусдай» сразу ассоциируется с «вирус дай», что звучит очень смешно.
Да, согласен. Зато запомнить просто. Раньше в SERP по этому запросу песни группы Вирус показывались.
Для этого предлагается скачать и разместить уникальный для каждого пользователя *.PHP файл в корневом каталоге сайта.

Пока похоже на добровольное размещение эксплоита.
Обратиться напрямую к этому файлу и выполнить вредоносные действия на сайте не получится, так как сервис имеет несколько степеней защиты, включая проверку цифровых подписей при каждом запросе к файлу. В следующих постах мы подробнее расскажем об архитектуре сервиса.
Более того, сам «вирусдай» в меру его подключения к куче сайтов, становится крайне привлекательным для разного рода хакеров (конкурентов, инсайдеров, 3-рд парти, черных сеошников и т.д.), просто уже в меру того, что «хакнул одного — хакнул всех».
Эдакий «ключ от всех дверей».
Ненене.
Поверьте, мы тоже всё это понимаем. И поэтому постарались сделать удобный и безопасный инструмент для наших пользователей, который имеет несколько степеней защиты на каждом этапе взаимодействия между сервером-клиентом и Вирусдай.
Специальный файл синхронизации называется вебшел и только одному богу известно что потом через него они смогут сделать с сайтом, не говоря уже о том, что запросто смогут скачать себе все его исходники или залить туда что-то свое.
Внешнее сканирование — самый отличный вариант, с этим хорошо справляется сервис Nazamok.com
Да, у Вирусдай есть возможность редактировать и удалять файлы, в этом и смысл обнаружения и лечения заражённых файлов, которые невозможно обнаружить, а тем более вылечить снаружи (восновном это файлы *.php).
Вы себе на комп антивирус ставили?
Вот именно, у вас есть возможность редактировать и удалять файлы моего сайта без моего ведома.
Не это ли называется вебшелом?
Хотите сравнить себя с антивирусом, ок, покажите пожалуйста сертификаты соответствия ФСТЭК России и ФСБ.
Кроме того, устанавливая скачанные из интернета малоизвестные компоненты для CMS мало кто задумывается о том, что в них так же могут быть эксплойты. Часто эти компоненты обфусцированы и что они делают на самом деле, сказать сложно. Код всех наших загружаемых файлов открыт.
Того, кто качает малоизвестные компоненты для CMS, меньше всего волнует их завирусованность.
Код загружаемых файлов открыт, но обфусцирован, по крайней мере «файл синхронизации». Зачем?

Обфускация — это сознательное запутывание кода. В файле синхронизации просто убраны пробелы и переносы строк в целях уменьшения его объема.
Вы свой файл синхронизации видели?
И это я еще бьютифайером прошелся.
это не обфускация?
<?php
/**version:16,date:2015-05-28**/
return ((list($e, $rr, $rd, $_, $pv) = array(
	0,
	NULL,
	NULL,
	'',
	PHP_VERSION
)) && (list($iv, $fv, $ii, $gt, $df, $dd, $is, $ig, $ia, $tz, $vc, $st, $sl, $ss, $sp, $tr, $pd, $sr, $sc, $tm, $pf, $bh, $zi, $zd, $be, $bd, $bq, $im, $in, $aw, $wr, $ic, $uf, $bn, $dn, $if, $id, $ir, $iw, $md, $fg, $fp, $cm) = explode(':', 'intval:floatval:is_numeric:gettype:define:defined:ini_set:ini_get:ini_get_all:date_default_timezone_set:version_compare:is_string:strlen:substr:strpos:strtr:str_pad:str_repeat:strcmp:trim:sprintf:bin2hex:gzinflate:gzdeflate:base64_encode:base64_decode:http_build_query:implode:in_array:array_walk:array_walk_recursive:is_callable:create_function:basename:dirname:is_file:is_dir:is_readable:is_writable:mkdir:file_get_contents:file_put_contents:chmod')) || ($e = 103) && 0) && ($vc($pv, '5.2', '>=') || ($e = 113) && 0) && ($ig('allow_url_fopen') && ((!$ig($_ = 'magic_quotes_runtime')) || ($is($_, 0) !== FALSE)) && ((!($iv($ig('mbstring.func_overload')) & 3)) || mb_internal_encoding('8bit')) && (ini_set('arg_separator.output', '&') || 1) || ($e = 100) && 0) && (@$tz('UTC') || 1) && ($ig('magic_quotes_gpc') && ($_ = $uf('&$v,$i', '$v=stripslashes($v);')) && $wr($_GET, $_) && $wr($_COOKIE, $_) || 1) && ($df('SVC_CVER', 16) && $df('SVC_CKEY', 'yhtQ49n2US53h653') && $df('SVC_HOST', 'cdn.virusdie.ru/') && $df('SVC_USERAGENT', "Mozilla/5.0\x20(compatible)\x20S.D.S.\x20Network\x20client/" . SVC_CVER) && ($is('user_agent', SVC_USERAGENT) || 1) && $df('SVC_HOSTLINK', 'http://' . SVC_HOST) && $df('SVC_SUBPATH', isset($_SERVER['SCRIPT_NAME']) ? ($in($dn($_SERVER['SCRIPT_NAME']) , array(
	'/',
	'\\',
	'.'
)) ? '' : rtrim(strtr($dn($_SERVER['SCRIPT_NAME']) , array(
	'\\' => '/'
)) , '/')) : '') && $df('SVC_CFILE', $bn(__FILE__)) && $df('SVC_CDIR', $tm($dd('PATHINFO_FILENAME') ? pathinfo(SVC_CFILE, PATHINFO_FILENAME) : $ss(SVC_CFILE, 0, strrpos(SVC_CFILE, '.')))) && $df('SVC_CCACHE', SVC_CDIR . '/cache') && $df('SVC_CRESTORE', SVC_CDIR . '/restore') && $df('SVC_CBACKUPS', SVC_CDIR . '/backups') && $df('SVC_CUSERINIT', SVC_CDIR . '/userinit.php') && $df('SVC_CTIME', time()) && $df('SVC_CGZIP', $iv($ic($zi))) && $df('ERR_' . 'SVC', 900) && $df('SVC_CHOST', isset($_SERVER['SERVER_NAME']) && $sl($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : (isset($_SERVER['HTTP_HOST']) && $sl($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_ADDR'])) && $df('SVC_UID', $tm(isset($_GET['svcuid']) ? $_GET['svcuid'] . '' : (isset($_COOKIE['svcuid']) ? $_COOKIE['svcuid'] . '' : ''))) && $df('SVC_KEY', $tm(isset($_GET['svckey']) ? $_GET['svckey'] . '' : (isset($_COOKIE['svckey']) ? $_COOKIE['svckey'] . '' : ''))) && $df('SVC_MAC', $tm(isset($_GET['svcmac']) ? $_GET['svcmac'] . '' : (isset($_COOKIE['svcmac']) ? $_COOKIE['svcmac'] . '' : ''))) && $df('SVC_DBI', $tm(isset($_GET['svcdbi']) ? $_GET['svcdbi'] . '' : (isset($_COOKIE['svcdbi']) ? $_COOKIE['svcdbi'] . '' : ''))) && $df('SVC_SVC', isset($_GET['svc']) ? $tm($tr($_GET['svc'] . '', '\\/.:?*', $sr('_', 6))) : '') && $df('SVC_CRC', isset($_GET['crc']) && ($sl($_GET['crc']) == 8) ? $_GET['crc'] . '' : '') && $df('SVC_CLV', isset($_GET['clv']) ? abs($iv($_GET['clv'])) : 0) && $df('SVC_CTR', isset($_GET['ctr']) ? $tm($_GET['ctr'] . '') : '') && $df('SVC_DBG', isset($_GET['dbg']) ? min(3, abs($iv($_GET['dbg']))) : 0) && $df('SVC_SID', isset($_GET['sid']) ? $iv($_GET['sid']) : 0) && $df('SVC_MD5', md5($im(':', array(
	SVC_SVC,
	SVC_CRC,
	SVC_UID,
	SVC_KEY,
	SVC_DBI,
	SVC_CVER,
	SVC_CKEY,
	SVC_HOST,
	SVC_SID
)))) && $df('SVC_MACDATA', $im(':', array(
	SVC_SVC,
	SVC_CRC,
	SVC_UID,
	SVC_KEY,
	SVC_CTR
))) && $df('SVC_CPHP', SVC_CCACHE . '/svc-' . SVC_SVC . '-' . SVC_MD5 . '.php') && $df('SVC_CSVCCACHE', SVC_CCACHE . '/' . SVC_SVC) && $df('SVC_BETATEST', isset($_GET['svcbetatest'])) && $df('SVC_QBASE', $bq(array(
	'svcuid' => SVC_UID,
	'svckey' => SVC_KEY,
	'ctr' => SVC_CTR,
	'cfn' => SVC_CFILE,
	'clv' => SVC_CVER,
	'php' => $fv($pv) ,
	'clz' => SVC_CGZIP,
	'ref' => SVC_CHOST,
	'sid' => SVC_SID
))) && $df('SVC_QCDN', SVC_HOSTLINK . 'cdn/?' . SVC_QBASE . '&' . $bq(array(
	'svc' => SVC_SVC,
	'crc' => SVC_CRC
))) && $df('SVC_QAPI', SVC_HOSTLINK . 'api/') && $df('SVC_QDATA', SVC_HOSTLINK . 'data/') && $df('SVC_QDATASVC', SVC_HOSTLINK . 'data/' . SVC_SVC . '/') && $df('SVC_QUPD', SVC_HOSTLINK . 'update/?' . SVC_QBASE . '&' . $bq(array(
	'fmt' => 'update'
))) && $df('SVC_QSPLASH', SVC_HOSTLINK . 'splash/?' . $bq(array(
	'ref' => SVC_CHOST,
	'cfn' => SVC_CFILE
))) || ($e = 104) && 0) && (($svcContextOptions = array(
	'http' => array(
		'method' => 'GET',
		'header' => $im("\r\n", array(
			'Accept:*' . '/' . '*',
			'Connection:Close',
			'Referer:http://' . SVC_CHOST . '/' . SVC_CFILE,
			'User-agent:' . SVC_USERAGENT,
			'Cookie:' . $bq(array(
				'svcuid' => SVC_UID,
				'svckey' => SVC_KEY,
				'svcdbi' => SVC_DBI
			) , '', ';') ,
			''
		)) ,
		'follow_location' => 1,
		'max_redirects' => 3,
		'timeout' => 30,
		'ignore_errors' => FALSE,
		'user_agent' => SVC_USERAGENT
	)
)) && ($svcContext = stream_context_create($svcContextOptions)) || ($e = 103) && 0) && (count($_GET) || ($e = 115) && 0) && ($sl(SVC_UID) && $sl(SVC_KEY) || ($e = 101) && 0) && ($sl(SVC_SVC) || ($e = 102) && 0) && ((SVC_CLV <= SVC_CVER) || ($e = 105) && 0) && ((($sl(SVC_MAC) == 32) || ($e = 111) && 0) && (($ic($_ = 'hash_hmac') && !$sc($_('md5', SVC_MACDATA, SVC_CKEY . ':' . SVC_CTR) , SVC_MAC)) || ($ic($_ = 'mhash') && $dd('MHASH_MD5') && !$sc($bh($_(MHASH_MD5, SVC_MACDATA, SVC_CKEY . ':' . SVC_CTR)) , SVC_MAC)) || (($_ = $pd(($sl(SVC_CKEY . ':' . SVC_CTR) > 64) ? md5(SVC_CKEY . ':' . SVC_CTR, TRUE) : SVC_CKEY . ':' . SVC_CTR, 64, "\x00", STR_PAD_RIGHT)) && !$sc(md5(($_ ^ $sr("\x5c", 64)) . md5(($_ ^ $sr("\x36", 64)) . SVC_MACDATA, TRUE)) , SVC_MAC)) || ($e = 111) && 0) && ($sl(SVC_CTR) && (($_ = $if(SVC_CDIR . '/.ctr') ? @$fg(SVC_CDIR . '/.ctr', 0, NULL, -1, $sl(SVC_CTR)) . '' : '') || 1) && ($sl($_) <= $sl(SVC_CTR)) && ($sc(SVC_CTR, $pd($_, $sl(SVC_CTR) , '0', STR_PAD_LEFT)) > 0) || ($e = 112) && 0) && ($df('SVC_MACOK', 1) || 1)) && (!$in(SVC_DBG, array(
	1,
	2
))) && (($id(SVC_CCACHE) || @$md(SVC_CCACHE, 0751, TRUE)) && ($if(SVC_CDIR . '/.htaccess') || @$fp(SVC_CDIR . '/.htaccess', "Order\x20Allow,Deny\nDeny\x20From\x20All\n")) && @$fp(SVC_CDIR . '/.ctr', SVC_CTR . "\n" . SVC_MD5) || ($e = 106) && 0) && ((!rand(0, 30)) && $id(SVC_CCACHE) && is_array($_ = @scandir(SVC_CCACHE)) && $aw($_, $uf('$f,$i,$d', '($f[0]!=".")&&is_file($f=$d[0]."/".$f)&&(filemtime($f)<=$d[1])&&@unlink($f);') , array(
	SVC_CCACHE,
	SVC_CTIME - 86400 * 3
)) || 1) && (($sl(SVC_CRC) && $if(SVC_CPHP) && ($df('SVC_CACHED', 1) || 1)) || ((($st($rr = @$fg(SVC_QCDN, 0, $svcContext))) || ($e = 107) && 0) && ($sl($rr) || ($e = 108) && 0) && (($sl($rr) != 3) || (!$ii($rr)) || ($e = $iv($rr)) && 0) && (SVC_CGZIP ? (($st($rd = @$zi($rr)) && $sl($rd)) ? 1 : (($e = 108) && 0)) : (($rd = & $rr) || 1)) && ((@$fp(SVC_CPHP, $rd) === $sl($rd)) || ($e = 106) && 0) && ($df('SVC_CACHED', 0) || 1))) && (!$in(SVC_DBG, array(
	3
))) && (($rr = $rd = $_ = NULL) || 1) && (!$if(SVC_CUSERINIT) || !$ir(SVC_CUSERINIT) || (include ('./' . SVC_CUSERINIT)) || ($e = 114) && 0) && ($if(SVC_CPHP) && $ir(SVC_CPHP) && (SVC_CACHED && @touch(SVC_CPHP) || 1) && ($_ = (include ('./' . SVC_CPHP))) || ($e = 109) && 0) && (!($ii($_) && ($sl($_ . '') == 3)) || ($e = $iv($_)) && 0) || ($dd('SVC_DBG') && SVC_DBG && $dd('SVC_MACOK') && ($in(SVC_DBG, array(

	1
)) && phpinfo() || $in(SVC_DBG, array(
	2,
	3
)) && (list($l, $m, $d) = array(
	200,
	'...',
	":\x20"
)) && (header('Content-type:text/plain') || 1) && print_r(array(
	'CLIENT' => SVC_CVER,
	'STATUS' => $e,
	'HOST' => SVC_CHOST,
	'PHP' => $pv,
	'SAPI' => PHP_SAPI,
	'UNAME' => php_uname() ,
	'CWD' => getcwd() ,
	'LAST_ERROR' => error_get_last() ,
	'GZIP' => SVC_CGZIP,
	'PHP_MODULES' => $im(",\x20", get_loaded_extensions()) ,
	'CDN_RESULT' => $gt($rr) . ($st($rr) ? '(' . $sl($rr) . ')' : '') . $d . '"' . ($st($rr) ? (SVC_CGZIP ? $be($ss($rr, 0, $l)) : $ss($rr, 0, $l)) . $m : $rr) . '"',
	'CDN_DECODED' => $gt($rd) . ($st($rd) ? '(' . $sl($rd) . ')' : '') . $d . '"' . ($st($rd) ? $ss($rd, 0, $l) . $m : $rd) . '"',
	'$_GET' => & $_GET,
	'$_SERVER' => & $_SERVER,
	'PHP_INI' => $vc($pv, '5.3', '<') ? $ia() : $ia(NULL, FALSE)
)) || 1)) || (($e && ($e == 115)) && (($st($_ = @$fg(SVC_QSPLASH, 0, $svcContext))) && ($sl($_)) && (print ($_)) || ($e = 107) && 0) && (($e = 0) || 1)) || (($e && $in($e, array(
	105,
	402
))) && ($st($rr = @$fg(SVC_QUPD, 0, $svcContext))) && ($sl($rr)) && ($ss($rr, 0, 5) == '<' . '?' . 'php') && ($sp($rr, "('SVC_CVER'," . SVC_CLV . ")") !== FALSE) && ($sp($rr, SVC_CKEY) !== FALSE) && (($iw($_ = SVC_CFILE) || $cm($_, 0644)) && (@$fp($_, $rr) === $sl($rr)) || ($e = 106) && 0) && ($e = 110) && 0) || (($dd('SVC_EMBEDDED') || printf('%d', $e)) && 0) ? 0 : $e;

Это не обфускация. Мы преследовали цель максимально уменьшить размер файла. Никаких закодированных или зашифрованных данных в файле, как вы видите, нет. Это нормальный PHP код, просто он написан в виде одной сложной операции. Если вы проанализируете то, что он делает, то увидите, что ничего вредоносного непосредственно в нем нет.
Экономия байтов в именах переменных и переносов строк — ну это же смешно.
Ну будет он вместо 7,5 весить 20 килобайт. На скорости интерпретации это почти не скажется.
Какой смысл максимально уменьшать размер файла? Простите, я правда не понимаю.

И вы действительно считаете это нормальным PHP-кодом? Ваши коллеги-программисты прямо так вот и пишут?

Если посмотреть с точки зрения бизнеса.
Владелец сайта решает использовать ваш продукт и дает знакомому программисту Васе Пупкину проанализировать, что же он должен поставить на свой любимый сайт. Учитвая вашу ЦА, не думаю, что Вася будет достаточно квалифицированным для разбора этой «одной сложной операции». Он просто объявит, что там что-то похожее на вирус.

Впрочем, вы на рынке с 2012 года, не мне вас учить.
Может быть и так. По крайней мере до сегодняшнего дня вопросов по поводу доверия не возникало.
Выше все верно человек подметил — это и есть та самая «обфускация», которая наглухо убивает читабельность кода.
И извините или я отстал от «мира» или это называется не «убиранием пробелов» и «переносов строк»:
list($iv, $fv, $ii, $gt, $df, $dd, $is, $ig, $ia, $tz, $vc, $st, $sl, $ss, $sp, $tr, $pd, $sr, $sc, $tm, $pf, $bh, $zi, $zd, $be, $bd, $bq, $im, $in, $aw, $wr, $ic, $uf, $bn, $dn, $if, $id, $ir, $iw, $md, $fg, $fp, $cm) = explode(':',
        'intval:floatval:is_numeric:gettype:define:defined:ini_set:ini_get:ini_get_all:date_default_timezone_set:version_compare:is_string:strlen:substr:strpos:strtr:str_pad:str_repeat:strcmp:trim:sprintf:bin2hex:gzinflate:gzdeflate:base64_encode:base64_decode:http_build_query:implode:in_array:array_walk:array_walk_recursive:is_callable:create_function:basename:dirname:is_file:is_dir:is_readable:is_writable:mkdir:file_get_contents:file_put_contents:chmod'))

Можно это все еще завернуть в eval и preg_replace и от типичного шелла не отличишь xD
Мы обязательно учтем ваше мнение при дальнейшей работе над сервисом.
Это какой-то аплоадер ключей. Может лицензию так заливают на сайт клиента. С кучей отладки и дебагом.
Немношк читабельнее
<?php
/**
 * version: 16
 * date: 2015-05-28
 */

// init
$e = 0;
if (!$e) {
    $rr = NULL;
    $rd = NULL;
    $_ = '';
    $pv = PHP_VERSION;
} else {
    $e = 103; // WAT???
}

// check php version >= 5.2
if (!$e) {
    if (version_compare(PHP_VERSION, '5.2', '>=')) {
        // ok!
    } else {
        $e = 113;
    }
}

if (!$e) {
    if (
        ini_get('allow_url_fopen')
        && ( !ini_get('magic_quotes_runtime') || ini_set('magic_quotes_runtime', 0) !== FALSE )
        && ( !intval(ini_get('mbstring.func_overload')) & 3 || mb_internal_encoding('8bit') )
        && ( ini_set('arg_separator.output', '&') || 1 )
    ) {
        // ok!
    } else {
        $e = 100;
    }
}

if (!$e) {
    @date_default_timezone_set('UTC');
}

if (!$e) {
    if (ini_get('magic_quotes_gpc')) {
        array_walk_recursive($_GET, function(&$v, $i){
            $v = stripslashes($v);
        });
        array_walk_recursive($_COOKIE, function(&$v, $i){
            $v = stripslashes($v);
        });
    }
}

if (!$e) {
    define('SVC_CVER', 16);
    define('SVC_CKEY', 'yhtQ49n2US53h653');
    define('SVC_HOST', 'cdn.virusdie.ru/');
    define('SVC_USERAGENT', "Mozilla/5.0\x20(compatible)\x20S.D.S.\x20Network\x20client/".SVC_CVER);

    ini_set('user_agent', SVC_USERAGENT);

    define('SVC_HOSTLINK', 'http://'.SVC_HOST);
    define('SVC_SUBPATH',
        isset($_SERVER['SCRIPT_NAME'])
        ? (
            in_array(dirname($_SERVER['SCRIPT_NAME']), array('/', '\\', '.'))
            ? ''
            : rtrim(strtr(dirname($_SERVER['SCRIPT_NAME']), array('\\' => '/')), '/')
        )
        : ''
    );
    define('SVC_CFILE', basename(__FILE__));
    define('SVC_CDIR',
        trim(defined('PATHINFO_FILENAME')
        ? pathinfo(SVC_CFILE, PATHINFO_FILENAME)
        : substr(SVC_CFILE, 0, strrpos(SVC_CFILE, '.')))
    );
    define('SVC_CCACHE', SVC_CDIR.'/cache');
    define('SVC_CRESTORE', SVC_CDIR.'/restore');
    define('SVC_CBACKUPS', SVC_CDIR.'/backups');
    define('SVC_CUSERINIT', SVC_CDIR.'/userinit.php');
    define('SVC_CTIME', time());
    define('SVC_CGZIP', intval(is_callable(gzinflate)));
    define('ERR_SVC', 900);
    define('SVC_CHOST',
        isset($_SERVER['SERVER_NAME']) && strlen($_SERVER['SERVER_NAME'])
        ? $_SERVER['SERVER_NAME']
        : (
            isset($_SERVER['HTTP_HOST']) && strlen($_SERVER['HTTP_HOST'])
            ? $_SERVER['HTTP_HOST']
            : $_SERVER['SERVER_ADDR']
        )
    );
    define('SVC_UID', trim(isset($_GET['svcuid']) ? $_GET['svcuid'].'' : (isset($_COOKIE['svcuid']) ? $_COOKIE['svcuid'].'' : '')));
    define('SVC_KEY', trim(isset($_GET['svckey']) ? $_GET['svckey'].'' : (isset($_COOKIE['svckey']) ? $_COOKIE['svckey'].'' : '')));
    define('SVC_MAC', trim(isset($_GET['svcmac']) ? $_GET['svcmac'].'' : (isset($_COOKIE['svcmac']) ? $_COOKIE['svcmac'].'' : '')));
    define('SVC_DBI', trim(isset($_GET['svcdbi']) ? $_GET['svcdbi'].'' : (isset($_COOKIE['svcdbi']) ? $_COOKIE['svcdbi'].'' : '')));
    define('SVC_SVC', isset($_GET['svc']) ? trim(strtr($_GET['svc'].'', '\\/.:?*', str_repeat('_', 6))) : '');
    define('SVC_CRC', isset($_GET['crc']) && (strlen($_GET['crc']) == 8) ? $_GET['crc'].'' : '');
    define('SVC_CLV', isset($_GET['clv']) ? abs(intval($_GET['clv'])) : 0);
    define('SVC_CTR', isset($_GET['ctr']) ? trim($_GET['ctr'].'') : '');
    define('SVC_DBG', isset($_GET['dbg']) ? min(3, abs(intval($_GET['dbg']))) : 0);
    define('SVC_SID', isset($_GET['sid']) ? intval($_GET['sid']) : 0);
    define('SVC_MD5', md5(implode(':', array(SVC_SVC, SVC_CRC, SVC_UID, SVC_KEY, SVC_DBI, SVC_CVER, SVC_CKEY, SVC_HOST, SVC_SID))));
    define('SVC_MACDATA', implode(':', array(SVC_SVC, SVC_CRC, SVC_UID, SVC_KEY, SVC_CTR)));
    define('SVC_CPHP', SVC_CCACHE.'/svc-'.SVC_SVC.'-'.SVC_MD5.'.php');
    define('SVC_CSVCCACHE', SVC_CCACHE.'/'.SVC_SVC);
    define('SVC_BETATEST', isset($_GET['svcbetatest']));
    define('SVC_QBASE', http_build_query(array(
        'svcuid' => SVC_UID,
        'svckey' => SVC_KEY,
        'ctr' => SVC_CTR,
        'cfn' => SVC_CFILE,
        'clv' => SVC_CVER,
        'php' => floatval(PHP_VERSION),
        'clz' => SVC_CGZIP,
        'ref' => SVC_CHOST,
        'sid' => SVC_SID
    )));
    define('SVC_QCDN', SVC_HOSTLINK.'cdn/?'.SVC_QBASE.'&'.http_build_query(array(
        'svc' => SVC_SVC,
        'crc' => SVC_CRC
    )));
    define('SVC_QAPI', SVC_HOSTLINK.'api/');
    define('SVC_QDATA', SVC_HOSTLINK.'data/');
    define('SVC_QDATASVC', SVC_HOSTLINK.'data/'.SVC_SVC.'/');
    define('SVC_QUPD', SVC_HOSTLINK.'update/?'.SVC_QBASE.'&'.http_build_query(array(
        'fmt' => 'update'
    )));
    define('SVC_QSPLASH', SVC_HOSTLINK.'splash/?'.http_build_query(array(
        'ref' => SVC_CHOST,
        'cfn' => SVC_CFILE
    )));
} else {
    $e = 104; // WAT???
}

if (!$e) {
    $svcContextOptions = array(
        'http' => array(
            'method' => 'GET',
            'header' => implode("\r\n", array(
                'Accept:*/*',
                'Connection:Close',
                'Referer:http://'.SVC_CHOST.'/'.SVC_CFILE,
                'User-agent:'.SVC_USERAGENT,
                'Cookie:'.http_build_query(array(
                    'svcuid' => SVC_UID,
                    'svckey' => SVC_KEY,
                    'svcdbi' => SVC_DBI
                ), '', ';'),
                ''
            )),
            'follow_location' => 1,
            'max_redirects' => 3,
            'timeout' => 30,
            'ignore_errors' => FALSE,
            'user_agent' => SVC_USERAGENT
        )
    );
    $svcContext = stream_context_create($svcContextOptions);
} else {
    $e = 103; // WAT???
}

if (!$e) {
    if (count($_GET)) {
        // ok!
    } else {
        $e = 115;
    }
}

if (!$e) {
    if (strlen(SVC_UID) && strlen(SVC_KEY)) {
        // ok!
    } else {
        $e = 101;
    }
}

if (!$e) {
    if (strlen(SVC_SVC)) {
        // ok!
    } else {
        $e = 102;
    }
}

if (!$e) {
    if (SVC_CLV <= SVC_CVER) {
        // ok!
    } else {
        $e = 105;
    }
}

if (!$e) {
    if (strlen(SVC_MAC) == 32) {
        // ok!
    } else {
        $e = 111;
    }

    if (!$e) {
        if (
            is_callable('hash_hmac')
            && !strcmp(hash_hmac('md5', SVC_MACDATA, SVC_CKEY.':'.SVC_CTR), SVC_MAC)
        ) {
            // ok!
        } elseif (
            is_callable('mhash')
            && defined('MHASH_MD5')
            && !strcmp(bin2hex(mhash(MHASH_MD5, SVC_MACDATA, SVC_CKEY.':'.SVC_CTR)), SVC_MAC)
        ) {
            // ok!
        } elseif (
            $tmp = str_pad(
                strlen(SVC_CKEY.':'.SVC_CTR) > 64 ? md5(SVC_CKEY.':'.SVC_CTR, TRUE) : SVC_CKEY.':'.SVC_CTR,
                64,
                "\x00",
                STR_PAD_RIGHT
            )
            && !strcmp(
                md5(($tmp ^ str_repeat("\x5c", 64)).md5(($tmp ^ str_repeat("\x36", 64)).SVC_MACDATA, TRUE)),
                SVC_MAC
            )
        ) {
            // ok!
        } else {
            $e = 111;
        }
    }

    if (!$e) {
        if (strlen(SVC_CTR)) {
            $tmp = is_file(SVC_CDIR.'/.ctr') ? @file_get_contents(SVC_CDIR.'/.ctr', 0, NULL, -1, strlen(SVC_CTR)).'' : '';
            if (
                strlen($tmp) <= strlen(SVC_CTR)
                && strcmp(SVC_CTR, str_pad($tmp, strlen(SVC_CTR), '0', STR_PAD_LEFT)) > 0
            ) {
                // ok!
            } else {
                $e = 112;
            }
        } else {
            $e = 112;
        }
    }

    if (!$e) {
        define('SVC_MACOK', 1);
    }
}

if (!$e) {
    if (!in_array(SVC_DBG, array(1, 2))) {
        // ok!
    } else {
        $e = 'some shit!';
    }
}

if (!$e) {
    if (
        ( is_dir(SVC_CCACHE) || @mkdir(SVC_CCACHE, 0751, TRUE) )
        && ( is_file(SVC_CDIR.'/.htaccess') || @file_put_contents(SVC_CDIR.'/.htaccess', "Order\x20Allow,Deny\nDeny\x20From\x20All\n") )
        && @file_put_contents(SVC_CDIR.'/.ctr', SVC_CTR."\n".SVC_MD5)
    ) {
        // ok!
    } else {
        $e = 106;
    }
}

if (!$e) {
    if (!rand(0, 30)) {
        if (is_dir(SVC_CCACHE)) {
            $files = @scandir(SVC_CCACHE);
            if (is_array($files)) {
                array_walk(
                    $files,
                    function($f, $i, $d){
                        if ($f[0] != ".") {
                            $f = $d[0]."/".$f;
                            if (is_file($f) && filemtime($f) <= $d[1]) {
                                @unlink($f);
                            }
                        }
                    }
                    array(SVC_CCACHE, SVC_CTIME - 86400 * 3)
                );
            }
        }
    }
}

if (!$e) {
    if (strlen(SVC_CRC) && is_file(SVC_CPHP)) {
        define('SVC_CACHED', 1);
    } else {
        if (is_string($rr = @file_get_contents(SVC_QCDN, 0, $svcContext))) {
            if (strlen($rr)) {
                if (strlen($rr) != 3 || !is_numeric($rr)) {
                    if (SVC_CGZIP) {
                        $rd = @gzinflate($rr);
                        if (is_string($rd) && strlen($rd)) {
                            // ok!
                        } else {
                            $e = 108;
                        }
                    } else {
                        $rd = &$rr; // ok!
                    }

                    if (!$e) {
                        if (@file_put_contents(SVC_CPHP, $rd) === strlen($rd)) {
                            define('SVC_CACHED', 0);
                        } else {
                            $e = 106;
                        }
                    }
                } else {
                    $e = intval($rr);
                }
            } else {
                $e = 108;
            }
        } else {
            $e = 107;
        }
    }
}

if (!$e) {
    if (!in_array(SVC_DBG, array(3))) {
        // ok!
    } else {
        $e = 'some shit!';
    }
}

if (!$e) {
    $rr = $rd = NULL;
}

if (!$e) {
    if (!is_file(SVC_CUSERINIT)) {
        // ok!
    } elseif (!is_readable(SVC_CUSERINIT)) {
        // ok!
    } elseif (include './'.SVC_CUSERINIT) {
        // ok!
    } else {
        $e = 114;
    }
}

if (!$e) {
    $e = 109;
    if (is_file(SVC_CPHP) && is_readable(SVC_CPHP)) {
        if (SVC_CACHED) {
            @touch(SVC_CPHP);
        }
        if ($_ = include './'.SVC_CPHP) {
            $e = 0; // ok!
        }
    }
}

if (!$e) {
    if (!(is_numeric($_) && strlen($_.'' == 3))) {
        // ok!
    } else {
        $e = intval($_);
    }
}

if ($e) {
    if (defined('SVC_DBG') && SVC_DBG && defined('SVC_MACOK')) {
        if (in_array(SVC_DBG, array(1))) {
            phpinfo();
        } elseif (in_array(SVC_DBG, array(2, 3))) {
            header('Content-type:text/plain');
            print_r(array(
                'CLIENT' => SVC_CVER,
                'STATUS' => $e,
                'HOST' => SVC_CHOST,
                'PHP' => PHP_VERSION,
                'SAPI' => PHP_SAPI,
                'UNAME' => php_uname(),
                'CWD' => getcwd(),
                'LAST_ERROR' => error_get_last(),
                'GZIP' => SVC_CGZIP,
                'PHP_MODULES' => implode(",\x20", get_loaded_extensions()),
                'CDN_RESULT' => gettype($rr) . (is_string($rr) ? '(' . strlen($rr) . ')' : '') . ":\x20" . '"' . (is_string($rr) ? (SVC_CGZIP ? base64_encode(substr($rr, 0, 200)) : substr($rr, 0, 200)) . '...' : $rr) . '"',
                'CDN_DECODED' => gettype($rd) . (is_string($rd) ? '(' . strlen($rd) . ')' : '') . ":\x20" . '"' . (is_string($rd) ? substr($rd, 0, 200) . '...' : $rd) . '"',
                '$_GET' => &$_GET,
                '$_SERVER' => &$_SERVER,
                'PHP_INI' => version_compare(PHP_VERSION, '5.3', '<') ? ini_get_all() : ini_get_all(NULL, FALSE)
            ));
        } elseif ($e == 115) {
            if (is_string($_ = @file_get_contents(SVC_QSPLASH, 0, $svcContext)) && strlen($_)) {
                print($_);
                $e = 0;
            } else {
                $e = 107;
            }
        } elseif (in_array($e, array(105, 402))) {
            if (
                is_string($rr = @file_get_contents(SVC_QUPD, 0, $svcContext))
                && strlen($rr)
                && substr($rr, 0, 5) == '<'.'?'.'php'
                && strpos($rr, "('SVC_CVER'," . SVC_CLV . ")") !== FALSE
                && strpos($rr, SVC_CKEY) !== FALSE
            ) {
                if (is_writable($_ = SVC_CFILE) || chmod($_, 0644)) {
                    @file_put_contents($_, $rr) === strlen($rr);
                } else {
                    $e = 106;
                }
            }
            $e = 110;
        } else {
            if (!defined('SVC_EMBEDDED')) {
                printf('%d', $e);
            }
        }
    }

    return $e;
} else {
    return 0;
}

Не нашел в статье ничего про вашу целевую аудиторию, конкурентные преимущества (в т.ч. перед открытыми системами), гарантии, ответственности перед клиентами, какие системы и базы данных для анализа используете, кто вы в конце концов…

Мне кажется, что это очень важные вопросы особенно когда речь идет о безопасности.
1. Аудитория. Мы старались сделать сервис понятным как для владельцев сайтов (не обладающих специальными знаниями), так и для веб-мастеров. 2. Проектируя сервис основной нашей задачей было избавление веб-мастеров и владельцев сайтов от расходования времени (или максимального снижения временных затрат); Удобство и простота использования, одновременная работа со множеством сайтов, достаточность инструментов, автоматическое лечение без нарушения работоспособности ресурсов. 3. В комментарии целый пост не засунуть (отдельный пост про эффективность сервиса по сравнению с другими системами обязательно будет), но сравнивая с ClamAV или LMD можно сказать, что Вирусдай не удаляет файлы целиком, в то время, как LMD может только уничтожить целый файл. 4. Про базы данных в посте написано, но подробнее об этом будет также написано в отельной публикации. 5. Про гарантии. Конечно, техническая возможность злоупотребить доверием существует, но это не является нашей целью. Сегодня мало кто боится ставить антивирусные средства на конечные устройства, хотя раньше возникало множество страхов. Доверие пользователей нужно просто заслужить, что мы и делаем на протяжении более двух лет.
SQL injection выловит до ее успешного применения?
Фаервол нами задумывался именно для таких целей. Фаервол отрабатывает до выполнения каких-либо действий с базой данных движком сайта.
для сайтов на python у вас есть инструменты?
Если на сайте есть поддержка PHP, то наш сервис сможет с ним работать независимо от того, на чем сделан сам сайт. Работа сервиса не зависит от CMS сайта. Поиск угроз производится не только в PHP файлах, но так же и в JS, htaccess. Даже если сайт сделан на Python, то поддержку PHP для него все равно можно включить для работы с сервисом вирусдай.
Но ведь файлы на python'е он не сможет проверить. Думаю, изначальный вопрос в этом заключался.
Технически возможно проверять любые файлы, но .py файлы мы сейчас не проверяем, так как в нашей базе антивирусных сигнатур сейчас нет вирусов на питоне. Сервис ориентирован в первую очередь на PHP сайты. Тем не менее, база сигнатур постоянно пополняется, и то, какие файлы проверяются сервисом, зависит только от полноты этой базы.
Я не питонист, но логично, что сайт на питоне не исполнит файл *.php и скорее всего выдаст как обычный текст или появится окно сохранения файла.
На хабре много скептиков и параноиков, для увеличения доверия я бы выложил в движок антивируса на обозрение общественности.
Это совершенно другая, грустная история…
image
просто что-то похожее есть
Есть такой, однако, как-то даже тяжело говорить о похожести. Возможности не сравнить.
Ну можно попытаться. Давайте сделаем список вашего функционала и аналогии из манула:
Простой в использовании — аналогично
Автоматически устраняет вредоносный код — показывает его в таблице
можно воспользоваться встроенным редактором, в котором найденный фрагмент кода будет наглядно выделен и самостоятельно принять решение об удалении нужного куска — аналогично
Для снижения вероятности повторного заражения сайта и последствий от атак Вирусдай позволяет одним кликом установить фаервол на сайт — вот тут не могу точно сказать, всегда ли будет норм работать, например в случае питона, node.js или ruby

Сегодня антивирусная база пополняется нашим отделом антивирусных баз, а также использует несколько сторонних SDK

manul?
просто отличия есть, но принцип уж очень похож
даже интерфейс при сканировании.
А остальное вполне реально получить допиливанием.
Но по мне все равно рациональнее использовать манул — бесплатный, возможности аналогичны (в плане антивируса) и яндекс точно не будет воровать мои данные таким способом, да и код на гитхабе есть.
Хотя лучше норм делать защиту и не создавать необходимость использования подобных сервисов
Давайте для равновесия и я попробую их сравнить:

0. Конечно, интерфейс Манула очень похож на интерфейс Вирусдая образца 2013 года.
1. Манул не удаляет фрагменты файлов, сохраняя работоспособность ресурса.
2. Манул не проверяет по расписанию и не работает со множеством ресурсов одновременно.
3. Манул не имеет менеджера файлов.
4. Манул сложнее установить.
5. Не нашел в мануле редактора файлов с подсветкой кода.
6. Манул не автоматический.
7. Манул намного сложнее Вирусдая в использовании.
8. «Допилить» Манул до Вирусдая? Долго, полагаю придется пилить.
9. Код на гитхабе — возможно, плюс. Однако, не похоже, что сообщество подхватило эту идею (не удивительно). Сомневаюсь, что возможно в нужной степени модерировать изменения, производимые сообществом на уровне, достаточном для такого продукта.
10. Едва у нас есть цель воровства чьих-то данных, но да, здесь у Яндекса преимущество в авторитете.
11. Согласен, что лучше никогда не болеть, но такое едва ли пока реализуемо.

Конечно, говоря откровенно, мы не хотели конкурировать с Яндексом и предлагали совместную разработку (когда Яндекс только начинал свою) еще в начале 2014 года, однако, после некоторых хороших движений с обеих сторон это ничем не закончилось. Очень жаль.
Если вы раньше начали деятельность, то непонятно, кто на кого похож )) Невнимательно прочитал что с 2012 года начали.
Но это не отменяет факта наличия альтернатив и необходимости думать о защите
Конечно. Тут я полностью согласен.
О схожести говорить можно, только вот Яндекс анонсировал Манула в апреле, а Вирусдай уже имеет достаточно давнюю историю…
Совершенный триумф некомпетентности. Целевая аудитория — профнепригодные лентяи, использующие shared-хостинг и ни в зуб ногой не понимающие, что делают.
Не соглашусь. Едва ли людей, ценящих свое время (или попросту не ставящих перед собой цели постигнуть тайны кодинга) справедливо называть профнепригодными или лентяями. Нельзя же назвать триумфом некомпетентности продажу автомобилей или велосипедов людям, имеющим ноги.
UFO just landed and posted this here
UFO just landed and posted this here
Написал вам ответ в личку.
у вас верстка сбоку уползла в сафари www.dropbox.com/s/7xbm86pn33qv533/13123123123.png?dl=0
Спасибо за фидбек, занимаемся устранением проблемы.
iMalysh, я заметил в логах сервера обращения от бота virusdie (мой сайт тогда не был зарегистрирован на сервисе).
Какое предназначение этого бота?
Скорее всего это потому, что ваш сайт зарегистрирован в top.mail.ru, а Mail.ru Group пользуется нашим сервисом Вирусдай.Бот в рамках информирования своих пользователей о возможных угрозах.
UFO just landed and posted this here
«Сайт на wordpress» — это лишь блог, не имеющий никакого отношения к сервису и он физически расположен отдельно от файлов сервиса. И мы не находим проблем в том, что на бэкенде apache. Ну а 21 порт мы закроем, спасибо за совет.
Не могли бы вы сообщить ссылочку на исходник вашего волшебного "*.PHP файлика" (без апи ключей и любой конфедициальной информации), который вы предлагаете своим клиентам размещать в корне своих ресурсов? Право, очень любопытно, если он содержит в себе что то больше функции аутентификации и выполнения кода в eval
Этот файл генерируется при скачивании для каждого пользователя и он такой, какой есть, он в таком стиле написан. Фактически, это и есть исходник с убранными пробелами. Вы можете развернуть файл в читабельный вид сами в любой IDE. И кстати, там нет eval'ов.
Мне в данный момент не хочется ни регистрироваться в сервисе, ни тем более размещать чужеродный файл на своем ресурсе. Покажите, пожалуйста, с чем фактически вы предлагаете иметь дело. Разве имеются трудности в том чтоб не только сказать «Разместите у себя наш php скрипт», но и показать прямо тут — что за скрипт вы предлагаете разместить?
Обратите внимание на комментарий habrahabr.ru/company/virusdie/blog/259427/#comment_8446755 и ответы к нему. Там описано, что это и есть исходник файла с убранными пробелами. Этот файл дествительно написан вручную в таком стиле.
Просто у ребят обфускатор в руки встроен.
Думаю, что Вам стоит сформировать тарифные планы для нескольких сайтов. Или Ваши тарифы для неограниченного количества сайтов? Тогда об этом стоит где-то написать. Потому что в таблице используется «сайт», а не «сайты».
Не уверен до конца, что правильно понял вопрос, но постараюсь ответить правильно. Оплата предусмотрена из расчета за каждый сайт в отдельности. В более ранних версиях Вирусдая у нас действительно были пакетные предложения на 1, 3, 10, 25, 100 и более сайтов в списке. Год назад мы отказались от этого, поскольку во-первых это было (как ни странно) неудобно большинству людей, а во-вторых усложняло логику расчетов и сценарии для пользователей сервиса. Кроме того, в среднем на одного человека приходилось по 1 сайту. В итоге мы перешли к существующему сегодня подходу, а для партнеров мы можем по запросу формировать любые пакеты.
Вчера попросили помочь с одним сайтом на джумле. Человекам какая-то дрянь залезла на сайт, и теперь для входа в админку просит пароль.
Интереса ради поставил вашу штуку. Ничего не нашла.

Хотя с высокой степенью вероятности должно быть, т.к. сайт на джумле, куча каких-то плагинов (наверняка на варезах скачено), с сайта рассылается спам, есть масса зарегистрированных юзеров с логинами-рекламами…

Короче, есть какая-то дрянь внутри, но ваша система сообщает, что все ок.
Сейчас пойду посмотрю что Манул скажет
Манул тебе вряд-ли что тоже скажет. Там очевидно наличие .htpassw, поставленной хостерами. Посмотри журнал сообщений в панели хостинга, может предупреждали. Это стало достаточно стандартной практикой защиты на некоторых хостингах (дополнительный логин на уровне сервера) для предотвращения DoS-a и прочих внедрений кода путем брута админки.
Есть такое дело. Один «имен_не_называю» хостер в принудительном порядке для сайтов на wp и джумле поставил массово доп. авторизацию на директорию админок. Там по дефолту на эту доп. авторизацию логин «imnotabot», пароль «imahuman», как-то так. Так-что, возможно, владельцы того сайта, с которым gionet попросили помочь, редко заходят в админку и не читают писем от хостера. Опять-же, это всего-лишь предположение.
Манул указал на десяток подозрительных файлов, но на деле ничего ужасного я там не нашел.

Что бы быть до конца честным, я вынужден написать этот комментарий, т.к. выше написал почти претензию.

В итоге вирусдай ничего не нашел, манул почти ничего.

Вероятно уязвимость была связана или со слишком простыми паролями на фтп, админку и пр, или там какая-то не особо распространенная уязвимость, которую не смогли распознать скрипты.

Так что 0:0
Лично у меня претензий нет к вирусдаю, о чем официально заявляю
Сервис скорее напоминает «магическую наклейку от излучения на сотовый», которые были популярны в свое время.
Нет вообще никаких деталей по сервису (ни технических — какие требования к хостингу допустим, ни юридические — понятно что ответственности никакой, ни даже банальные — от каких вирусов и ситуаций спасает), на фоне этого рисуется обещание «защитить и помочь» всего за «1500р в год за сайт» — еще раз — без деталей даже о том, что именно (какие ситуации) покроет эта помощь и как именно (риски, требования, способы решения).
Так мало того, сервис еще и сторонний, а файл который предлагается загрузить — зашифрован в лучшем стиле вирусов. И может подгрузить себе еще что угодно. И ноль предупреждений о рисках на этом фоне, охохо.

Маркетинг для определенной ЦА — отпадный, проект наверняка выстрелит, гениально, серьезно.
Но на хабре такое презентовать нелепо…
1. Технические требования и рекомендуемые настройки серверов пользователей, как и положено, размещены на сайте сервиса. 2. Перечень определяемых классов вредоносного ПО также имеется. 3. Файл не зашифрован и этот вопрос уже подробнейшим образом рассмотрен в комментариях. 4. Все файлы сохраняются на состояние «до лечения» и их всегда можно откатить (об этом также написано). 4. Все сервисы в сети когда-то были «сторонними». Жаль, что люди часто ищут везде подвох. Это еще было бы понятно, будь сервис бесплатным.
Мне нравится ваш сервис. Серьезно. Я им буду пользоваться. Но утверждать, что файл не зашифрован, когда уже несколько человек вас пальцем ткнули в него и показали, что он весь обфусцирован, это уже смешно. Разобраться что он делает, нереально, так как применена самая настоящая обфускация и совсем неважно обфусцировали его вручную или с помощью программных средств, но это обфускация как ни крути.
Да, ребята нас уже ткнули в это узкое место. И тут нам придется что-то менять. Пока решаем что же выбрать:
1. Упростить код до «читабельного» (хотя и в мыслях не было ни какой обфускации)
или
2. В рамках отдельного технического поста подробно разобрать принцип его работы с разборкой кода.
Соглашение жжет.
3.5 Платные услуги считаются оказанными… в полном объеме… если они… предоставлялась… какое-либо количество времени в течение оплаченного… периода времени .
Разик предоставили услуги и в принципе все, свободен.

4.2.5 Администрация Сервиса имеет право… удалить учетную запись Пользователя,… без уведомления Пользователя и объяснения причин, в случае неиспользования платных услуг Сервиса в течение 90 (Девяносто) календарных дней
А если пользователь не дай бог на 3 месяца забыл о сервисе, то плевать на его годовой абонемент, удалить на фиг!

4.1.10 Денежные средства, переведенные на Лицевой и бонусный счета Пользователя, возврату не подлежат
И разумеется зажать все оставшиеся деньги.

4.1.11 Пользователь не имеет права использовать Сервис для работы с файлами (а также, проверки и/или лечения) веб-сайтов (кроме файлов веб-сайта, соответсвующему указанному в списке сайтов Пользователя доменному имени), находящихся во вложенных каталогах или в других каталогах на сервере Пользователя, доступ к которым может предоставить Сервис.
Это просто приятный «бонус», учитывая что на многих хостингах другие сайты в подпапках основного и будут проверяться просто автоматически.

Гарантии сервиса разумеется тоже «на высоте».
5.4 Администрация Сервиса не несет ответственности за любые виды убытков
5.7 Пользователь соглашается с тем, что использование Сервиса может нанести вред программному обеспечению, телекоммуникационному оборудованию, компьютерной технике Пользователя и/или третьих лиц, а также, привести к полной или частичной потере данных
Расчет на среднестатического пользователя, который не будет читать какие-то там соглашения и которого в последующем по любым вопросам можно будет тыкать носом в этот текст, мол «сам подписался, что теперь от нас хочешь?»

Не хорошо вы так к пользователям, ой, как не хорошо
Вы зарегистрированы в фейсбук? Если да, то вы читали их перед регистрацией и что вы можете сказать о правилах (https://ru-ru.facebook.com/terms.php) этой социальной сети, в частности о пункте 15.3 (там где об обжаловании)?
Во-первых, меня нет на фейсбуке;
Во-вторых, вы удивитесь, но я читаю правила и соглашения, особенно, когда речь идет о платных сервисах. Предупрежден — значит, вооружен
Вероятно, вы сколнны считать, что наше пользовательское соглашение отличается от соглашений других сервисов. Пожалуйста, прочитайте мой ответ на комментарий пользователю edogs ниже.
Почему удивлён? Нет меня это не удивляет.
Постараюсь прояснить и этот вопрос. Если вы знакомились с пользовательскими соглашениями или условиями использования сервисов таких компаний, как Мэйл.ру, Яндекс, Гугл или даже Фейсбук, то, вероятно, видели абсолютно тоже самое, но порой с еще более однозначными формулировками. Однако, разберу ваш комментарий по приведенным пунктам.

1. Допустим, вы решили перейти на годовое обслуживание сайта и, естественно, произвели оплату и получили соответствующий функционал. После этого вы, скажем, вылечили зараженный веб-сайт и решили на этом закончить работу на сервисе. Как бы вы предложили монетизировать подобный сценарий с нашей стороны? Пункт 3.5 — это решение вопроса.
2. Странно. Вы даже подчеркнули ответ на ваш вопрос в п.4.2.5. Имеется ввиду возможность удаления при неиспользовании платных услуг, а годовой тариф, как и любой платный — это же по определению платная услуга. Непонятна претензия.
3. 4.1.10 отсылает нас к комментарию №1.
4. 4.1.11 Полагаю, что мы имеем право таким образом защищать себя от фрода.
5. Снова попрошу вас прочитать эпиграф к данному ответу на ваш комментарий. Фейсбук, например, вам выплатит, как вы знаете, не более 100 долларов.
Для начала — фейсбук не хочет с нас денег (в отличии от Вас), не требует устанавливать мутноватый скрипт с полным доступом к нашему сайту (в отличии от Вас), не пытается рассказывать нам про обеспечение нашей безопасности (в отличии от Вас), так что сравнение мимо кассы.
И для конца — научитесь отвечать за себя. То что кто-то что-то где-то как-то — это пускай он сам за себя отвечает, предъявите ему претензии если Вас что-то так волнует, а Вы отвечайте за себя, а не кивайте «а вот у другого парня который занимается совсем другим все еще хуже».

Теперь по Вашему ответу. Вы несколько плаваете в своем же соглашении, что печалит. И даже не знаем что хуже — если Вы не понимаете проблему или специально игнорируете ее.
1. Это не решение вопроса. Это освобождение Вас от обязательств перед пользователем который хотя бы один раз воспользовался сервисом, несмотря на то, что у него годовой абонемент и в рекламе это преподносится как анлим.
2. Что «имеется ввиду» — это к телепатам. В соглашении написано совершенно однозначно — 3 месяца не использования сервиса — можно удалять. Годовой тариф — это возможность использования, использование — это проверка.
3. Отошлем Вас туда же.
4. Не защищаете от фрода, а ставите пользователя в такое положение (и скрываете это в глубинах соглашения), когда он может случайно и не зная об этом нарушить правила, при чем Вы заведомо знаете о том вероятность нарушения правил достаточно высока (на шареде у многих хостеров именно система подпапок).
5. Отошлем Вас туда же.
Мы от вас ничего не требуем. Пользоваться или нет — решать только вам. Не похоже, что вас интересует наше мнение. По какой-то причине вы пытаетесь толковать содержание документа выставляя сервис злодеями, не нацеленными на долговременные отношения со своими пользователями. Жаль. Однако, это ваша позиция и мы ее принимаем.
Имхо вполне стандартное соглашение для современных сервисов. Владельцы пытаются себя обезопасить со всех сторон. Вы ожидали чего-то другого? Покажите мне соглашение на каком-нибудь современном платном сервисе, где нет подобных пунктов. Насчет удаления аккаунта через 90 дней, то я уверен, что если абонемент оплачен на год, то никто его удалять не будет. ПыСы Я к этим ребятам не имею никакого отношения.
В комментариях на вас, как мне кажется, нападали не заслужено: владельцы типичного оффлайнового антивируса также ни за что не отвечают и ничего не гарантируют.

Сама по себе идея выглядит довольно интересной. Другое дело, что возможен ли у неё коммерческий успех? Понятно, что ориентируетесь вы в первую очередь на небольшие/дешёвые сайты, и, думаю, здесь есть проблема: владельцы таких сайтов вряд ли в типичной ситуации готовы к дополнительным расходам. Удаётся ли вам на данный момент зарабатывать насколько-нибудь вменяемые деньги?
Соглашусь. По мне так очень интересный сервис, которого лично мне давно не хватало, так как курирую несколько сайтов на жумле и проблема вирусов уже просто достала. Притом конкурентов этого сервиса я лично вообще не знаю (manul это всё-таки не то), так что идея суперская. Очень для меня не понятно, почему в комментариях так накинулись на этот сервис ища подвохи и обвиняя во всех смертных грехах.
А еще есть Nazamok.com, который производит внешнюю проверку, не просит ничего устанавливать и стоит в 10 раз дешевле.
А еще для внешней проверки существует масса бесплатных сервисов. Нужно отличать поверхностную проверку от полноценной. При поверхностной проверке вам недоступно практически ничего, только HTML, JS и поведенческий анализ. Если причина (как в 90%) в PHP или других файлах,- внешняя проверка не даст результатов.
Начнем с того, что бесплатный сыр только в мышеловке :)
При поверхностной проверке доступно огромное количество возможностей.
Такая же синхронизация сайта с сервером, только с помощью умных алгоритмов и без размещения файлов.
Внешнее слежение за изменением ссылок, ифреймов, яваскриптов, воровство трафика ит.д. (а именно это хакеры внедряют в сайт в 90% случаев)
Да, не все угрозы обнаруживаются (например спам скрипты), но внедрение в сайт или в базу данных любого вредоносного кода, который напрямую отражается на сайте и может стать причиной занесения поисковиками в черный список, либо наложения на сайт других санкций таким образом отслеживаются элементарно.
Да, лечить и искать место заражения придется самому, но не придется для этого размещать к себе какие-то левые зашифрованные файлы.
И это уже не говоря о том, что разобравшись какие данные отправляет ваш файл, злоумышленнику, проникнувшему на сайт, не составит труда их изменить и отправлять вам, что все хорошо. Владелец будет спокойно сидеть потеряв бдительность, а на сайте будет твориться вирусная рассада :)
Кстати еще про некоторые эпизоды хотелось бы узнать — фаерволл на wordpress к примеру работает по принципу добавления правил в .htaccess? И как будет правка работать если у меня права на запись на файлах и директориях убраны?
Нет. .htaccess не затрагивается. По второй части не очень понятно, о какой правке речь. Если речь о лечении (о редактировании файлов антивирусом), то здесь важны права пользователя, от имени которого работает PHP (Вот наши рекомендации: https://virusdie.ru/faq/syncproblems/).
UFO just landed and posted this here
Сэр! По поводу архитектуры и антивирусной базы будет отдельный большой пост.
UFO just landed and posted this here
>Кстати почему «облачный» антивирус?
Соответственно принципам работы сервиса.
UFO just landed and posted this here
Похоже, вы путаете облачные хранилища с общим термином Облачные технологии. Обработка данных в понятиях облачных технологий (или общего понимания облачных сервисов) может быть как централизованной (100% на серверах SaaS), так и разделенной. Понятие «Облачный», как вам должно быть известно, не является сегодня жестким или однозначным и обозначает направление (тренд) переноса обработки данных (полной или частичной) в SaaS. Какая именно реализация (и с какой архитектурой) выбирается в каждом конкретном проекте — дело только его авторов. Термин применен нами вполне осознанно и корректно.
UFO just landed and posted this here
  • Убедитесь, что директива allow_url_fopen имеет следующее значение: allow_url_fopen=On (или 1).
  • Убедитесь, что пользователь, от имени которого работает PHP имеет права на запись в конрневую папку вашего сайта


Просто умилительно.
Очень милое публичное убийство продукта.

Мне кажется, что ваша ЦА не на Хабре находится.
Никто в здравом уме не будет выполнять ваши рекомендации и закачивать ваш файл к себе на сервер. Имхо, конечно же.
Итак, я рискнул, и поставил ваш волшебный скрипт на один из своих сайтов. С трудом преодолев естественное недоверие к чужому обфусцированному коду.

Сегодня пришло уведомление:

Обнаружены заражения следующих типов:
PregReplace.E.
Рекомендуется немедленное лечение пораженных файлов.
15:14 04.06.2015


В статусе показано: автоматическое лечение — недоступно, подсветка вредоносного кода — доступно. Рекомендуется удаление.
Конечно же, по ссылке предлагается перейти на платный тариф.

Информация о том, где обнаружен зараженный файл, конечно, будет доступна только после оплаты.
Классификация «типов заражений», очевидно, своя — название ни о чём не говорит и в интернете не ищется.
Свежий ClamAV ничего подозрительного не находит.

Каждый из этих фактов, конечно, имеет право на существование, и каждому можно найти естественное объяснение. Но в совокупности это всё очень напоминает интернет-пугалки «ваш компьютер заражён, установите немедленно вот эту программу для лечения».

Но ничего, я поизучал ваш сайт, «пробил» компанию по базе ЕГРЮЛ, и решил таки пройти квест до конца, пожертвовав 500 руб. за право посмотреть на вредоносный код. Оплатил (при оплате были сбои, но сейчас не об этом).

Появилась обещанная подсветка кода. Сервис счёл подозрительным файл форума SMF Subs-Auth.php, содержащий следующий фрагмент:
preg_replace('~&#(\d+);~e',


Да, это потенциально уязвимый код. В последней версии SMF эта уязвимость устранена. Но это оригинальный код SMF, ни о каком заражении здесь речь не идёт.

Итог: заплатил 500 руб. за напоминание о том, что исходники форума нужно периодически обновлять.
Интересно как поведет себя автоматическое «лечение», наверное удалит строку и положит сайт. Идеальный сервис разорвать отношение с заказчиком и получить статус «рукож#па» )) Зато с благими намерениями.
В данном случае автоматическое лечение бы не сработало. Greesha выше показал список функций, доступных для этого вердикта, а именно: «В статусе показано: автоматическое лечение — недоступно, подсветка вредоносного кода — доступно...»
У меня сейчас на бесплатном аккаунте нашло тоже самое, и тоже говорит что подсветка кода доступна. Но я в упор не вижу куда тыкнуть чтобы показать зараженный файл. Чяднт?
Вы в файловый редактор не сможете перейти на бесплатном тарифе. Сейчас как раз занимаемся модернизацией данного сценария, чтобы решить эту задачу. Напишите в саппорт или в личку ваш логин — мы посмотрим в чем дело.
Конечно, понятен диссонанс, который у вас вызвал статус вердикта «Заражение». По статистике, более чем в 90% случаев группа правил, определяющих данный вердикт определяет именно Заражения, но, как в вашем случае, бывают исключения и под детектирование подпадает не определенно вредоносный код, а уязвимость. Путаница из-за термина «Заражение» понятна. Однако, несмотря на диссонирующий статус антивирус, как вы правильно заметили, просто выполнил свою работу, которую и должен был сделать — нашел уязвимость, которая, как вы заметили в текущей версии уже устранена.

Конечно, мы подумаем над более полным структурированием вердиктов по статусам.
UFO just landed and posted this here
На самом деле, это абсолютно логичный исход, скрипт обнаружил preg_replace*е, и посчитал, что это уязвимость.
Было бы крайне наивно полагать, что скрипт будет анализировать исходный код, а не просто искать вхождения сигнатур.

Надо просто понимать, что скрипт поиска сигнатур не может быть защитой, в том числе превентивной.

Продукт такого плана рассчитан на ленивых владельцев сайтов на joomla, ни больше, ни меньше, да простит меня автор.

Автору «антивируса»:
P.S. если автору интересно мнение человека, немного понимающего в ИБ — бросьте эту затею. Разделите продукт на 2 части:
1) серверный WAF
2) spider-сканер сайтов на паблик уязвимости (предварительно собрав и автоматизировав базу уязвимостей)

И отбросьте всё лишнее, типа этих «антивирусов» бесполезных. Если цель получить 500 рублей от любопытных людей, как комментатор выше, то вы действуете верно. Но, если вы преследуете цель создать продукт, то не выдумывайте велосипедов одноколёсных, а сосредоточьтесь на полезных продуктах.

UPD: под «разделить» я имел в виду не оставить в текущем виде, но располовинить, а переработать и осмыслить.
>Продукт такого плана рассчитан на ленивых владельцев сайтов на joomla, ни больше, ни меньше, да простит меня автор.

Уверяю вас, никто не в обиде. Сколько людей, столько и мнений. Если подобный сервис был бы абсолютно ненужным и никому не интересным — до столь развернутого обсуждения дело бы не дошло, верно?

Но т.к. эта мысль в комментариях проскакивала уже не раз, выскажу свое мнение. Лично я не вижу ничего плохого в бесплатных cms типа вордпресса и джумлы (обсуждаемому сервису, напомню, без разницы на какой cms сайт, на платной, бесплатной или вообще на самописном движке). Мне было бы интересно узнать, у какого процента комментирующих профессиональных админов и спецов по безопасности есть свои сайты (или сайты клиентов), которые они собственноручно создали от и до без использования популярных cms, абсолютно защищенных на все 100%? Так-же интересно знать каков процент владельцев сайтов (речь уже обо всем интернете) является админами? Я это к тому, что многие в комментариях довольно негативно отнеслись к сервису, исходя из своих знаний и навыков. Но надо учитывать, что владельцы сайтов в подавляющем большинстве совсем не админы, а личный админ сервера и безопасник есть далеко не у каждого.
А ещё очень позабавил раздел «Доходы и вывод средств». Вот, серьёзно, вы себя позиционируете как антивирус или это очередной хайп?
Вы ко всем партнеркам так относитесь?
Партнёрки партнёркам рознь.
С вашей логикой трудно спорить.
Малость запутала логика.

Зарегистрировался. Скормил неблагополучный сайт. Сначала понравилось. Ну, заплатил 500 рублей и добавил ещё горстку сайтов. Оказывается, как выяснилось, лечится только один. причём тестовый. Зря старался.

Вордпресс-плагин "Anti-Malware from GOTMLS.NET" к примеру, и сканирует и лечит бесплатно. Но зарабатывают они благодаря тому, что сканирование по расписанию, отправку отчётов на почту и файрвол предоставляется только в платной версии. причём нет ограничений по количество подключенных сайтов — отправил один раз донату в 30 баксов и юзай в своё удовольствие. Я, правда, признаюсь, уже несколько раз донату отправлял, ну просто потому что они мне нравятся.

Из Ваших же плюсов, если сравнивать — вижу удобство юзания ну и грамотные подстветки.

Но за это добро платить 500 рублей неохота. В общем, резюмируя, чувствую, что меня ввели в заблуждение не дав явно понять что я плачу за один сайт а не за сервис целиком. 500 рублей на ветер, я — лох. Поздравляю себя.
А что случилось то с сервисом? На хабре удалились, сайт не работает. Всё?
Ну, отчего же. Сервис вполне себе прекрасно работает. Ни каких проблем с доступностью не замечено.
Сейчас открылся. Вчера и сегодня утром не открывался и даже не пинговался. Может у вас там какие-то ультра DDOS-фильтры?)
Ну так вы их подкрутите, чтобы сервис то работал :)
Сервис абсолютная хрень. Заплатил за несколько сайтов. Пишет вирусов нет, а хостер блокирует отправку писем и присылает пути к зараженным файлам на лист А4.
Здравствуйте!
Вас приветствует Регистратор доменных имён REG.RU!
бла… бла… бла
Результат проверки антивируса Virusdie:
{VIRUSDIE}PregReplace.E: u0000000: /var/www/u0000000/data/www/site.ru/protected/vendor/yiisoft/yii/framework/vendors/TextHighlighter/Text/Highlighter/Renderer/Console.php

pear.php.net/package/Text_Highlighter
4 года жил себе preg_replace и не знал бед. А теперь вне закона! Как в дешёвом плохом кино.
Хочу сказать пару слов благодарности.
От rating@corp.mail.ru пришло письмо с указанием что у меня на сайте вирус:
«Обнаружены заражения: Trojan.Inject.9 Рекомендуется немедленное лечение пораженных файлов.»
И ссылка на virusdie.
При регистрации там дали 1 день бесплатно и попытался вылечить сайт, причем в отличие от Manul (я его поставил тоже) virusdie удалял именно зараженные куски файлов, а не все подряд.
В автоматическом режиме вылечить сайт не удалось (похоже вирус как то скрывался и себя все равно размножал), но сервис помог найти подозрительные файлы и после ручного лечения (мной) позволил убедится что все чисто.
Так же очень помог плагин Wordfence Scan, который умеет сравнивать измененные файлы (по сравнению с эталонным WordPress).
В общем спасибо, если бы не этот сервис и плагин копался бы я долго.
А вот Manul скорее не помог никак. Да, сервис нашел кучу подозрительных файлов. Но нет возможности удобного просмотра подозрительных мест, нет и удобной корректировки файлов (а их было много!)
Sign up to leave a comment.