Bezpečnost komunikačních sítí v praxi: Sítě 3G (II)

23. 8. 2012

Sdílet

Autor: © olly - Fotolia.com
Sítě UMTS jsou z hlediska zabezpečení rozhodně důstojným nástupcem sítí GSM. Jak se ovšem chová celá dnes užívaná platforma?

Vraťme se ovšem nejdříve o krok zpět. Vzhledem k poměrně tragické penetraci UMTS sítí v našich krajích nesmíme opomenout také nástavbu na GSM sítě umožňující přenos paketových dat, tzv. GPRS. V dnešní době nalezneme často na displeji mobilního telefonu symboly označující variantu GPRS nazvanou EDGE, a to pokud mobilní terminál přenáší data na území pokrytém GSM. 

Přenosová síť GPRS je z pohledu mobilního operátora ve skutečnosti oddělena od GSM sítě s tím, že se dělí o přenosovou část rádiového rozhraní. GPRS obecně poskytuje mírně vyšší úroveň zabezpečení proti GSM, ovšem často je šifrování přenosu dat přes EDGE či GPRS vypnuto nebo je přenos šifrován pomocí slabé šifry A5/2. V případě UMTS je podpora přenosu paketových dat nedílnou součástí sítě, a tudíž bezpečnost je řádově vyšší než u GPRS v GSM síti.

Opět tedy naznačme několik strategií napadení UMTS. Cílem může být odposlouchávání hlasového hovoru či tzv. unesení hovoru neboli příchozí hovor je zodpovězen jiným terminálem.

Nesmíme ovšem zapomenout na implementaci rozhraní pro legální odposlech tzv. LI, jež existuje také v sítích UMTS. To opět umožňuje velmi komfortní možnost odposlechu pro státní moc přímo na hlavní síťové infrastruktuře operátora bez jeho nutné asistence či vědomí. 

První možností přicházející v úvahu, bez přístupu k LI rozhraní, je tzv. man-in-the-middle útok spočívající v ustavení falešného přístupového bodu do sítě. V případě UMTS je tento způsob napadení komplikován existencí rozšířené autentikační procedury, která nově zahrnuje i ověření sítě terminálem. Co se tedy stane, jestliže se pokusíme vydávat falešný UMTS přístupový bod za legální přístupový bod do sítě mobilního operátora?

Mobilní telefon se pokusí k falešnému bodu přihlásit, ale jelikož nevlastníme validní klíč mobilního operátora, přístroj se k našemu bodu odmítne přihlásit. Tedy variantou by mohl být pokus o podvržení klíče identifikující síť operátora, což je ovšem výpočetně velmi náročná operace. Další možností je využití existující kompatibility mobilních terminálů s GSM zároveň s UMTS.

Tím pádem přinucením mobilního terminálu k přihlášení k našemu GSM přístupovému bodu je možné využít bezpečnostní mezery v GSM. Odposlech hovoru směrovaného přes náš přístupový bod je triviální stejně jako únos příchozího hovoru nebo zahájení hovoru s identitou kterékoli stanice přihlášené k našemu bodu. Toto je samozřejmě nerealizovatelné, pokud je mobilní terminál kompatibilní pouze s UMTS, to je ovšem naprosté minimum.

Odposlechové prostředky dostupné na současném trhu pracují na podobném principu, kdy nutí mobilní telefon přihlásit se k falešnému přístupovému bodu. Jak se tedy bránit podobnému typu odposlechu? Jednou z možností obrany je volit typ mobilního terminálu, který nabízí variantu připojení pouze do UMTS sítě.

Jak se bránit?
Zkusme se pozastavit u varianty odposlechu přímo na rádiovém rozhraní, tedy odposlechu informací, které proudí vzduchem a kdokoli je může zachytit. Zde narážíme na několik přístupových úrovní, které musíme řešit. Nejprve se můžeme pokusit přinutit mobilní stanici užívat pouze GSM část sítě a ideálně i slabší šifru A5/2. Tím pádem jsme schopni poměrně rychle rozkódovat obsah odposlouchávaných kanálů. Jestliže nejsme schopni stanici nutit zůstat pouze v GSM nebo UMTS síti, nezbývá než sledovat, ve které síti aktuálně je daný přenos uskutečněn. Vzhledem k tomu, že mobilní terminál může volně přecházet mezi definovanými sítěmi UMTS a GSM, nezbývá než buď sledovat řízení přenosu, nebo monitorovat celé pásmo, kde se terminál může vyskytovat, a hovor z něj postupně vykrajovat.

Pomineme-li pro zjednodušení předávání hovoru mezi GSM a UMTS a zůstaneme pouze u UMTS, pak je nutné získat kód pro digitální demodulátor, jelikož v UMTS je použita kódová modulace. Dále musíme vzít v potaz různé varianty vysokorychlostních přístupů k UMTS sítím, jelikož odposlechové zařízení je musí zvládat dekódovat.

Pochopitelně je nutno dekódovat šifrování v UMTS síti, které je nepoměrně bezpečnější než to v GSM. Zde je nutné podotknout, že jak mobilní terminál, tak mobilní síť musí z důvodů zpětné kompatibility podporovat i starou šifru A5/2. Tedy existuje možnost vynucení použití šifry A5/2 a tudíž usnadnění luštění. Nepříjemností, na kterou budeme narážet, je sledování mobilní stanice, jelikož jednoznačný identifikátor IMSI je pro účely komunikace nahrazen dočasným identifikátorem TMSI. Musíme také zjistit, co vlastně sledujeme, jde o paketová data, nebo hlasovou službu či jiný obsah?

Spousta aplikací, které nabízejí šifrování telefonních hovorů, vlastně využívá datovou službu k přenosu šifrovaných dat. Z toho plyne také potenciálně nižší kvalita takové služby. Pochopitelně jestliže je použito šifrování hovorových dat přes datovou službu, pak je komplikovaný i legální odposlech. Legální odposlech získá šifrovaná data namísto digitálního hovorového signálu. 

Elegantní forma útoku na mobil
Vzhledem k tomu, že technologie se vyvíjela od doby vzniku standardu zabezpečení, nabídla se v průběhu poslední doby elegantní díra do mobilní bezpečnosti.

V okamžiku, kdy existuje přístup do interních funkcí mobilního terminálu, nemusíme lámat kódy na rádiovém rozhraní nebo konfigurovat falešné přístupové body. Stačí napadnout software v telefonu a nechat jej dělat věci, které požadujeme. V době, kdy software do mobilního telefonu byl výhradně zodpovědností výrobce, bylo komplikované jej napadnout hlavně kvůli nedostupnosti zdrojového kódu atd.

Ovšem dnes je na trhu přehršel mobilních telefonů s otevřenými operačními systémy a ve spoustě případů jsou uživatelé ochotni odposlechovou aplikaci nainstalovat sami. Zde přichází do hry sociální inženýrství a další techniky známé z internetu. Ovšem předpokládáme-li znalého uživatele dbalého bezpečnostních zásad práce se smartphonem, není možné se cítit v bezpečí ani tak.

Instalace upraveného softwaru pro odposlech či obecně napadení softwaru telefonu je otázkou mála minut, na které pustíme telefon z dohledu. Nainstalovaná úprava může například jednoduše odposlouchávat přímo mikrofon a sluchátko a data ukládat či odesílat zájemci.Co tedy s tím? Jestliže chceme maximálně bránit odposlechu, pak nezbývá než pořídit co nejuzavřenější mobilní platformu nebo ideálně jednoúčelový mobilní telefon s šifrováním hovorů.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }