Ruské vojenské jednotky vedou kyberkampaň proti podporovatelům Ukrajiny, varuje NÚKIB

22. 5. 2025
Doba čtení: 1 minuta

Sdílet

Terorista muž kybernetický hacker hacking internet přístup ukrást informace o notebooku, lupič trestní koncept
Autor: Shutterstock
Útoky podle zprávy NÚKIBu míří zejména na logistické a technologické firmy zapojené do zahraniční pomoci Ukrajině.

Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) se připojil spolu s Bezpečnostní informační službou a Vojenským zpravodajstvím České republiky a partnery ze Spojených států, Spojeného království, Německa, Polska, Austrálie, Kanady, Dánska, Estonska, Francie a Nizozemska k upozornění na dlouhodobou kybernetickou kampaň vedenou aktéry podporovanými Ruskem. Tyto útoky jsou cíleny zejména na logistické a technologické firmy zapojené do zahraniční pomoci Ukrajině.

Za kampaní stojí jednotka ruské vojenské rozvědky GRU č. 26165, známá pod označením APT28 (též Fancy Bear, Forrest Blizzard aj.). Tato skupina již více než dva roky vede špionážní operace proti subjektům z obranného a dopravního sektoru, zahrnující leteckou, námořní a železniční dopravu. Zasahují také vládní instituce a komerční společnosti v členských státech NATO, na Ukrajině i v sousedních zemích.

Jednotka 26165 podle NÚKIBu rovněž aktivně monitorovala přepravu pomoci na Ukrajinu prostřednictvím přístupu k IP kamerám umístěným na hraničních přechodech, železničních uzlech a dalších strategických bodech. V rámci sledované kampaně se zaměřili především na IP kamery využívající protokol RTSP, přičemž použili veřejně známé výchozí přihlašovací údaje nebo techniky brute force pro prolomení přístupu.

Získaná data zahrnovala statické snímky a metadata z kamer. Z analýzy více než 10 000 cílených kamer vyplývá, že většina z nich (81 %) se nacházela na Ukrajině. Další se vyskytovaly v Rumunsku, Polsku, Maďarsku a na Slovensku.

Aktéři GRU se dále zaměřovali na jednotlivce odpovědné za koordinaci dopravy a společnosti spolupracující s napadenými organizacemi. Zneužívali důvěryhodné obchodní vztahy k dalšímu šíření v cílových sítích. Identifikovali také subjekty zapojené do výroby komponent pro systémy průmyslového řízení (ICS), které se používají např. v železniční dopravě.

NÚKIB upozorňuje, že tyto aktivity budou pravděpodobně pokračovat. Technologické a logistické společnosti, stejně jako organizace v oblasti dopravy, by proto měly posílit monitorování, aktivně vyhledávat známky kompromitace (threat hunting) a zavést odpovídající ochranná opatření proti těmto sofistikovaným hrozbám.

Zdroj: NÚKIB

Čtěte dále

Sophos Experience: Transformace budoucnosti kybernetické bezpečnosti
Sophos Experience: Transformace budoucnosti kybernetické bezpečnosti
Photon Go: Chytrý přenosný projektor s ultra krátkou projekční vzdáleností od Optomy
Photon Go: Chytrý přenosný projektor s ultra krátkou projekční vzdáleností od Optomy
Arrow posiluje nabídku úložišť, podepsalo smlouvu s Object First
Arrow posiluje nabídku úložišť, podepsalo smlouvu s Object First
Objem dat skokově roste, zvyšuje rizika deepfake útoků
Objem dat skokově roste, zvyšuje rizika deepfake útoků
Pavel Cvetler je novým produktovým a IT ředitelem Shoptetu
Pavel Cvetler je novým produktovým a IT ředitelem Shoptetu
Ruské vojenské jednotky vedou kyberkampaň proti podporovatelům Ukrajiny, varuje NÚKIB
Ruské vojenské jednotky vedou kyberkampaň proti podporovatelům Ukrajiny, varuje NÚKIB
'; 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'; } }
OSZAR »