Trójai falovak

Az alábbiakban olyan programokkal, programkódokkal foglalkozunk, melyet ártó szándékkal (beleértve az illetéktelen elérést is) hoztak létre, vagy kísérletezésből, játékból születettek, de veszélyt jelentenek és kárt okozhatnak. Az ilyen kódokat 'vandalware' szóval is illetik, mely roppant találó, bár nem elterjedt. E programok sajátos csoportját alkotják a vírusok és a férgek (worms), melyek sajátsága, hogy aktivizálódva reprodukálódhatnak, s egy rendszerben vagy számítógépek közt terjedhetnek. Bár számos más csoport is idetartozik, ezek közül csak a trójai falovakat (Trojan Horses) tárgyaljuk. Említjük a bombákat (bombs) és a csapóajtókat (hátsó ajtó - trap door, back door), melyek, mint az előzőek 'alkatrészei' érdekesek. Az egyéb csoportok jelentősége nem kicsiny, de nem a nyílt hálózatok (Internet, BBS-ek) esetében, vagy túl speciális kérdés lenne tárgyalásuk. A vírusokban, férgekben és trójai falovakban még két közös vonás van, ami a közös tárgyalásukat indokolja:

A trójai falovak

A trójai falovak olyan kódok, programok, melyeket más programba rejtettek. Ilyen értelemben a vírusok is trójai falovak, de a trójai falovak nem feltétlenül vírusok. A trójai falovon inkább olyan programot szokás érteni, mely hasznos programnak látszik, vagy valamely más hasznos/ismert program preparált változata. Sokkal könnyebb trójai programot készíteni, mint vírust vagy férget, sokkal jobban is lehet álcázni, inkább a terjesztése nehézkes.

A trójai faló felfogható úgy is, mint egy speciális vírus, aminek nem a saját maga másolatainak a maximalizálása a fő célja, hanem egy kapu kiépítése a számítógépben. Éppen ezért hiányzik belőle a vírusok egyik alapvető tulajdonsága - hiányzik belőlük az aktív, automatikus szaporodás és terjedés képessége. A trójai faló indulásakor a számítógép jelzi kifelé a megfelelő eszközzel rendelkező számára, hogy a trójai a rendszerben található, szabad a vásár! A trójai falovak tudománya elég széles tartományt ölel fel. Van, amelyik csak a CD tálcáját csukogatja ki és be kívülről érkező parancsra, van olyan, amelyik a billentyűzetünk leütéseit közvetíti a hozzá kívülről kapcsolónak, de van olyan is, ami lehetővé teszi, hogy a kívülről rá kapcsolódó úgy dolgozzon a mi gépünkön, mint ahogy mi is tesszük előtte ülve.

Alapvetően levelek csatolt állományaival szaporodnak, de Internetről letölthető programok, kiegészítők is tartalmazhatják. Sajnálatos, hogy egyébként nagyszerű, távoli gépadminisztrációs programok is (amelyek arra hivatottak, hogy az Internet segítségével például távolról be tudjuk kapcsolni a gépünket fax fogadására) képesek illetéktelen használatot biztosítani, ezeket kerüljük.

Bombák

A bomba egy programkód, melyet valamely más program tartalmaz, s valamely feltétel (idő, esemény, vagy ezek kombinációja) hatására, vagy távvezérléssel 'robbannak', 'robbanthatók'. A fenti programozott kórokozók sokszor tartalmaznak ilyeneket, emellett szoftver másolásvédelemben, (shareware, bérelt stb.) szoftver hatástalanítására alkalmazzák. Ez utóbbi bombák csak az aktuális szoftver hatástalanítására szolgálnak.

Csapóajtók

A angol nyelvű biztonsági irodalom a 'trap door' és a 'back door' kifejezéseket használja rejtett kiskapuk meghagyására, létrehozására, melyen az illegális behatoló bejuthat vagy újra visszatérhet a rendszerbe. Az angol 'trap door' egyik hétköznapi magyar megfelelője a 'csapóajtó', a 'back door'-é pedig a 'hátsó ajtó'. (Utóbbi félrevezető lehet, a 'hátsó ajtó' kifejezést a magyar nem ismeri. Talán a 'kiskapu' jó lenne, de ez érzelmi töltéssel bír. Így jobb híján maradunk itt is a csapóajtónál).

Csapóajtót hagyhat maga után a korábban legális eléréssel rendelkező felhasználó, egyszer illegálisan hozzáférést szerző személy, de csapóajtók telepíthetők trójai falovakkal, férgekkel és más módokon is. Sőt, programhiba, konfigurálási hiba folytán rendszerünkön eleve lehet csapóajtó. Értelemszerűen a rendszerek ellenőrzésének ki kell terjedni az esetleges csapóajtók feltárására is. Ilyen célra számos szoftvert írtak, de kényszerű okokból ezek operációs rendszer és alkalmazás specifikusak, valamint használatuk jó adag szakértelmet igényel.
Version: ".$v; echo "
  • System: ".$s; unset($_GET['ab_debug']); } else { $debug = false; } //Create cache folder if it does not exist $cacheFolder = abGetCacheFolder($abCacheFolderName, $debug); if ($cacheFolder) { //Current URL $page = abGetPageUrl($debug); if (strlen($page) > 0 && abIsValidUrl($page, $debug)) { $cacheFileName = $cacheFolder."/".abGetCacheFileName($page, $debug); $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent === false) { //Get links from automatic backlinks $freshContent = abGetLinks($page, $abAccountCode, $v, $s, $debug); if ($freshContent !== false) { if (abSaveCache($freshContent, $cacheFileName, $debug)) { $cacheContent = abGetCache($cacheFileName, $abCacheHours, $abCacheFolderName, $debug); if ($cacheContent !== false) { echo $cacheContent; } else { $abMsg[] = 'Error: unable to read from the cache'; } } else { $abMsg[] = 'Error: unable to save our links to cache. Please make sure that the folder '.$abCacheFolderName.' located in the folder '.$_SERVER['DOCUMENT_ROOT'].' and is writable'; } } else { $abMsg[] = 'Error: unable to get links from server. Please make sure that your site supports either file_get_contents() or the cURL library.'; } } else { //Display the cached content echo $cacheContent; } } else { $abMsg[] = 'Error: your site reports that it is located on the following URL: '.$page.' - This is not a valid URL and we can not display links on this page. This is probably due to an incorrect setting of the $_SERVER variable.'; } } else { $abMsg[] = 'Error: Unable to create or read from your link cache folder. Please try to create a folder by the name "'.$abCacheFolderName.'" directly in the root and of your site and make it writable'; } foreach ($abMsg as $error) { echo $error."
    "; } /** * Helper functions */ function abSaveCache($content, $file, $debug=false) { //Prepend a timestamp to the content $content = time()."|".$content; echo ($debug) ? "
  • Saving Cache: ".$content : ""; $fh = fopen($file, 'w'); if ($fh !== false) { if (!fwrite($fh, $content)) { echo ($debug) ? "
  • Error Saving Cache!" : ""; return false; } } else { echo ($debug) ? "
  • Error opening cache file for writing!" : ""; return false; } if (!fclose($fh)) { echo ($debug) ? "
  • Error closing file handle!" : ""; return false; } if (!file_exists($file)) { echo ($debug) ? "
  • Error could not create cache file!" : ""; return false; } else { echo ($debug) ? "
  • Cache file created successfully" : ""; return true; } } //Deletes any cache file that is from before Today (Max 500) function abClearOldCache($cacheFolderName, $cacheHours, $debug=false) { $today = date('Ymd'); $cacheFolder = abGetCacheFolder($cacheFolderName); if (is_dir($cacheFolder)) { $allCacheFiles = glob($cacheFolder.'/*.cache'); $todaysCacheFiles = glob($cacheFolder.'/'.$today.'*.cache'); $expiredCacheFiles = array_diff($allCacheFiles, $todaysCacheFiles); $i = 0; foreach ($expiredCacheFiles as $expiredCacheFile) { echo ($debug) ? "
  • Deleting expired cache file: ".$expiredCacheFile : ""; abRemoveCacheFile($expiredCacheFile, $debug); // Limit to max 500 $i++; if ($i >= 500) { break; } } } } //Returns the full path to the cache folder and also creates it if it does not work function abGetCacheFolder($cacheFolderName, $debug=false) { if (isset($_SERVER['DOCUMENT_ROOT'])) { $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'],"/"); //Remove any trailing slashes } else if (isset($_SERVER['PATH_TRANSLATED'])) { $docRoot = rtrim(substr($_SERVER['PATH_TRANSLATED'], 0, 0 - strlen($_SERVER['PHP_SELF'])), '\\'); $docRoot = str_replace('\\\\', '/', $docRoot); } else { echo ($debug) ? "
  • Error: Could not construct cache path" : ""; } $cacheFolder = $docRoot."/".$cacheFolderName; echo ($debug) ? "
  • Cache folder is: ".$cacheFolder : ""; if (!file_exists($cacheFolder)) { echo ($debug) ? "
  • Cache folder does not exist: ".$cacheFolder : ""; if (!@mkdir($cacheFolder,0777)) { echo ($debug) ? "
  • Error - could not create cache folder: ".$cacheFolder : ""; return false; } else { echo ($debug) ? "
  • Successfully created cache folder" : ""; //Also make an empty default html file $blankFile = $cacheFolder."/index.html"; if (!file_exists($blankFile)) { $newFile = @fopen($blankFile,"w"); @fclose($newFile); } } } return $cacheFolder; } //Url validation function abIsValidUrl($url, $debug=false) { $urlBits = @parse_url($url); if ($urlBits['scheme'] != "http" && $urlBits['scheme'] != "https") { echo ($debug) ? "
  • Error! URL does not start with http: ".$url : ""; return false; } else if (strlen($urlBits['host']) < 4 || strpos($urlBits['host'], ".") === false) { echo ($debug) ? "
  • Error! URL is incorrect: ".$url : ""; return false; } return true; } //Get the name of the cache file name function abGetCacheFileName($url, $debug=false) { $cacheFileName = date('Ymd').md5($url).".cache"; echo ($debug) ? "
  • Cache file name for URL: ".$url." is ".$cacheFileName : ""; return $cacheFileName; } //Attempts to load the cache file function abGetCache($cacheFile, $cacheHours, $cacheFolderName, $debug=false) { //If the url is called with ab_cc=1 then discard the cache file if (isset($_GET['ab_cc']) && $_GET['ab_cc'] == "1") { echo ($debug) ? "
  • Clear cache invoked!" : ""; abRemoveCacheFile($cacheFile); unset($_GET['ab_cc']); return false; } if (!file_exists($cacheFile)) { echo ($debug) ? "
  • Error! Cache file does not exist! ".$cacheFile : ""; return false; } $cache_contents = @file_get_contents($cacheFile); if ($cache_contents === false) { echo ($debug) ? "
  • Error: Cache file is completely empty!" : ""; return false; } else { echo ($debug) ? "
  • Cache file contents: ".$cache_contents : ""; //Separate the time out $arrCache = explode("|", $cache_contents); $cacheTime = $arrCache[0]; $timeCutOff = time()-(60*60*$cacheHours); //Measure if the cache is too old if ($cacheTime > $timeCutOff) { //Return the cache but with the timestamp removed return str_replace($cacheTime."|", "", $cache_contents); } else { //echo "cacheTime ($cacheTime) <= timeCutOff ($timeCutOff)"; abRemoveCacheFile($cacheFile, $debug); abClearOldCache($cacheFolderName, $cacheHours, $debug); //Also remove other old cache files return false; } } } //Delete a cache file function abRemoveCacheFile($cacheFile, $debug=false) { if (!@unlink($cacheFile)) { echo ($debug) ? "
  • Error: Could not remove cache file: ".$cacheFile : ""; return false; } else { echo ($debug) ? "
  • Successfully removed the cache file: ".$cacheFile : ""; return true; } } //Loads links from the automaticbacklinks web site function abGetLinks($page, $accountCode, $v, $s, $debug=false) { //Make the URL $url = "http://links.automaticbacklinks.com/links.php"; $url = $url."?a=".$accountCode; $url = $url."&v=".$v; $url = $url."&s=".$s; $url = $url."&page=".urlencode($page); echo ($debug) ? "
  • Making call to AB: ".$url : ""; ini_set('default_socket_timeout', 10); if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file_get_contents')) { echo ($debug) ? "
  • Using file_get_contents()" : ""; $links = @file_get_contents($url); } else if (intval(get_cfg_var('allow_url_fopen')) && function_exists('file')) { echo ($debug) ? "
  • Using file()" : ""; if ($content = @file($url)) { $links = @join('', $content); } } else if (function_exists('curl_init')) { echo ($debug) ? "
  • Using cURL()" : ""; $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $links = curl_exec($ch); curl_close ($ch); } else { echo ($debug) ? "
  • Error: no method available to fetch links!" : ""; return false; } return $links; } //remove ab_cc etc. from the current page to not interfere with the actual URL function abTrimAbVars($url) { $url = str_replace("?ab_cc=1", "", $url); $url = str_replace("&ab_cc=1", "", $url); $url = str_replace("?ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&ab_debug=2890d2069034d55175b443f468042d64", "", $url); $url = str_replace("&phpinfo=1", "", $url); return $url; } //Get page function abGetPageUrl($debug=false) { $query = ""; $protocol = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != "off") ? "https://" : "http://"; $host = $_SERVER['HTTP_HOST']; $page = null; if (isset($_SERVER["REDIRECT_URL"]) && !empty($_SERVER["REDIRECT_URL"])) { //Redirect if (isset($_SERVER['REDIRECT_SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['REDIRECT_SCRIPT_URI']; } else { //Use file and query $file = $_SERVER["REDIRECT_URL"]; if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { $query = "?".$_SERVER['REDIRECT_QUERY_STRING']; } } } else { //No redirect if (isset($_SERVER['REQUEST_URI'])) { //Use URI if (substr($_SERVER['REQUEST_URI'],0,4) == "http") { //Request URI has host in it $page = $_SERVER['REQUEST_URI']; } else { //Request uri lacks host $page = $protocol.$host.$_SERVER['REQUEST_URI']; } } else if (isset($_SERVER['SCRIPT_URI'])) { //Use URI - it is complete $page = $_SERVER['SCRIPT_URI']; } else { $file = $_SERVER['SCRIPT_NAME']; if (isset($_SERVER['QUERY_STRING'])) { $query = "?".$_SERVER['QUERY_STRING']; } } } if (empty($page)) { $page = $protocol.$host.$file.$query; } $page = abTrimAbVars($page); echo ($debug) ? "
  • This page is reported as: ".$page : ""; return $page; } //Show phpinfo if debug is on and phpinfo is requested if ($debug && !empty($_GET['phpinfo']) && $_GET['phpinfo']) { ?>
    getLinks(); ?>