České firmy nejsou dostatečně chráněny před kybernetickými útoky

26. 11. 2019

Sdílet

Autor: Fotolia © fuzzbones
České průmyslové firmy, ale ani elektrárny, nejsou dostatečně chráněny před potenciálními počítačovými útoky. Průzkum společnosti Soitron poukázal na to, že minimálně 1580 řídicích systémů ve firmách v České republice je vystaveno riziku útoků, které mají šanci proniknout do jejich řídících průmyslových systémů.

Zavádění nejnovějších technologií do výroby a partnerského řetězce s sebou přinesl vyšší dostupnost průmyslových řídících systémů, ke kterým lze zároveň přistupovat z vícero koncových bodů a veřejného internetu. "Vzdálený přístup je dnes běžně využívanou metodou pro sledování nejen výrobních technologií nebo logistiky zásobování výroby, ale například i malých vodních či solárních elektráren," upozorňuje Martin Lohnert z Void SOC.

Právě na stav zabezpečení průmyslových řídicích systémů českých firem se zaměřil průzkum společnosti Soitron realizován týmem analytiků Void SOC. Bezpečnostní specialisté se ale během průzkumu nepokoušeli nalezené systémy hackovat. "Naši bezpečnostní analytici hledali systémy, které jsou dostupné z internetu a jsou slabě zabezpečeny, ale nepokoušeli se je žádným způsobem zneužít. Pracovali v režimu "read-only"," vysvětluje M. Lohnert. Jak dodává, do výsledků průzkumu zařadili pouze průmyslové řídící systémy, kde bylo patrné vysoké riziko průniku hackerů nebo škodlivého softwaru, s možností uškodit dané firmě.

Průmyslové firmy lze bez větší námahy napadnout přes internet

Průzkum našel 1580 průmyslových řídicích systémů vystavených riziku kybernetického útoku, ať už ve výrobních firmách nebo v malých elektrárnách. I bez nutnosti jakéhokoliv hackingu umožnilo nedostatečné zabezpečení bezpečnostním analytikům v reálném čase vidět výrobní linku pivovaru s možností aktivního ovládání, systém fotovoltaické elektrárny s nabídkou vytvoření vlastního hesla, či parkoviště monitorované průmyslovou kamerou.

Hrozba kybernetického útoku však nesouvisí pouze s připojením řídicích systémů na internet. Dnes mnohé firmy využívají ve svých provozech na údržbu systémů externí firmy, které se mohou například do výrobní linky připojit přes vlastní počítač nebo mobil. "Pokud jsou zařízení takového dodavatele s přístupem do výroby slabě zabezpečené, což standardně jsou, je riziko pro firmu ještě výrazně vyšší," upozorňuje David Dvořák, IT konzultant pro kybernetickou bezpečnost společnosti Soitron.

Příčiny nízké ochrany průmyslových řídicích systémů vidí v nárocích, které na výrobní firmy klade rostoucí automatizace a digitalizace řízení. "Dnes více než kdy v minulosti platí, že před kybernetickým útokem není nikdo na 100 % v bezpečí. Jsou však možnosti, jak eliminovat riziko a případné škody i v případě sofistikovaných průniků," dodává D. Dvořák.

Jak se chránit před útokem?

V první řadě je to aktivní přístup firem k otázce ochrany jejích systémů před kybernetickými hrozbami. Zároveň je nezbytné nastavit a pravidelně kontrolovat procesy zaměřené na zajištění kybernetické bezpečnosti ve firmě. "Jednak jde o průzkumem potvrzené nezajištění řídicích systémů před neoprávněným přístupem přes internet, což je velmi viditelný problém. Ale jsou to i takové věci jako například přístup zaměstnanců a dodavatelů do interních sítí se zařízeními připojenými na internet," dodává D. Dvořák.

hacking_tip

Stejně důležitý je reakční čas, pokud monitoring kybernetické bezpečnosti zachytí průnik do systémů firmy. "Ne každý incident musí skončit špatně, pokud začnete situaci řešit okamžitě, jak vznikne. Minimálně tím, že se pokusíte minimalizovat škody, například odpojením napadeného zařízení v provozu," poukazuje na možnosti řešení M. Lohnert.

Problémem v případě českých průmyslových firem, který může být i důvodem nelichotivých výsledků průzkumu, může být (ne)dostupnost kvalitních bezpečnostních analytiků. Ne v každém regionu České republiky je dnes na trhu práce dostatek volných specialistů na kybernetickou bezpečnost. "Mnohé firmy jsou v regionech, kde byste asi možná specialistu na kybernetickou bezpečnost našli velmi těžko. Navíc, pokud si máte zajistit monitoring hrozeb v režimu 24/7, jelikož hackeři často neútočí v době plného provozu svého cíle, potřebujete více takových specialistů," vysvětluje M. Lohnert.

'; 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'; } }