Eset: Reklamní malware zneužívá optimalizace pro vyhledávače v macOS

6. 12. 2021
Doba čtení: 2 minuty

Sdílet

Autor: © freshidea - Fotolia.com
Skoro v polovině případů zachycených hrozeb pro operační systém macOS se v říjnu jednalo o adware. Ten může zneužívat i techniky SEO a cílit na uživatele sponzorovaným obsahem.

Společnost Eset vydala pravidelnou analýzu hrozeb pro operační systém macOS, z níž vyplývá, že v říjnu se mezi detekovanými hrozbami objevil reklamní malware, který využívá optimalizace pro vyhledávače (tzv. SEO) a sponzorovaný typ obsahu.

Analytici upozorňují, že i když adware nepředstavuje přímé riziko, snižuje výpočetní výkon zařízení a tím i jeho použitelnost. Vážnější hrozbou je pak reklamní obsah, který uživatele po kliknutí přesměruje na manipulativní stránku, kde z něj útočníci mohou vylákat citlivé údaje.

Pirrit je dlouhodobou hrozbou

Eset uvádí, že nejčastěji se v říjnových datech objevil adware Pirrit, který je v českém prostředí rizikem dlouhodobě. Po letních měsících, kdy se jeho aktivita kontinuálně zvyšovala, počet jeho detekcí v říjnu klesl.

Stálým rizikem je i podle bezpečnostních expertů i adware Bundlore, který často stahuje nějaký doplněk do internetového prohlížeče nebo aplikaci, která pak zobrazuje další reklamu.

V případě adwaru Pirrit se jedná o celou malware rodinu, která je v českém prostředí stabilně aktivní, a ani v budoucnosti nepředpokládáme, že by se situace výrazně změnila,“ říká Jiří Kropáč, vedoucí virové laboratoře společnosti Eset v Brně.

O zařízení od společnosti Apple podle něj pravděpodobně poroste zájem ze strany uživatelů, a to z důvodu dlouho očekáváného zpřístupnění servisních manuálů a originálních náhradních dílů.

A s rostoucím počtem zařízení můžeme samozřejmě očekávat i nárůst zájmu ze strany útočníků. Z celosvětového hlediska tak bude adware spíše ve své činnosti posilovat,“ dodává Kropáč.

Malware zneužívá optimalizace pro vyhledávače

Prostřednictvím sponzorovaného obsahu a optimalizace pro vyhledávače (SEO) se šíří i další adware MaxOfferDeal, který podle Esetu také patřil mezi nejčastější říjnové hrozby.

Uživatel může následovat tyto sponzorované odkazy při hledání aplikací, jejichž názvy zadá do internetového vyhledávače. Vyhledané aplikace ale po stažení nemají jinou funkci než instalovat další adware či zobrazovat reklamní obsah.

Propagovaný a optimalizovaný obsah je v tomto případě poskytnutý výrobcem škodlivého kódu. Uživatelé na něj mohli narazit při vyhledávání aplikací jako Easy Meme Generator, Image To Excel convertor, Unzip nebo Weather display,“ popisuje Kropáč.

Nejčastější kybernetické hrozby v České republice pro platformu macOS za říjen 2021:

  1. OSX/Adware.Pirrit (30,12 %)
  2. OSX/Adware.Bundlore (6,02 %)
  3. OSX/Adware.MaxOfferDeal (4,82 %)
  4. OSX/Adware.Synataeb (2,41 %)
  5. OSX/TrojanDownloader.Adload (2,41 %)

Zdroj: Eset

Čtěte dále

Nejširší nabídka ProAV technologií? Najdete ji u EET Group
Nejširší nabídka ProAV technologií? Najdete ji u EET Group
Na NIS2 si vyhraďte minimálně 6 měsíců, radí Jan Sedlák z MasterDC
Na NIS2 si vyhraďte minimálně 6 měsíců, radí Jan Sedlák z MasterDC
Ruské vojenské jednotky vedou kyberkampaň proti podporovatelům Ukrajiny, varuje NÚKIB
Ruské vojenské jednotky vedou kyberkampaň proti podporovatelům Ukrajiny, varuje NÚKIB
Pavel Cvetler je novým produktovým a IT ředitelem Shoptetu
Pavel Cvetler je novým produktovým a IT ředitelem Shoptetu
Karel Diviš: Firmy potřebují jednoho stabilního dodavatele IT
Karel Diviš: Firmy potřebují jednoho stabilního dodavatele IT
Arrow posiluje nabídku úložišť, podepsalo smlouvu s Object First
Arrow posiluje nabídku úložišť, podepsalo smlouvu s Object First
'; 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 »