91³Ô¹ÏÍø

Watch CBS News

Russian drone strike on port city kills married couple, injures 17, Ukraine officials say

Russian drones struck the southern Ukrainian port city of Odesa overnight, killing two people and injuring at least 17, Ukrainian authorities said on Saturday. Meanwhile, three attack helicopters and an anti-aircraft missile system were destroyed in the Russian-occupied Crimean Peninsula.

Ukraine's Security Service agency deployed special drones to attack the Kirovske military airfield, a Ukrainian security official said on Saturday.

"Available data indicate the destruction of multi-purpose and attack helicopters Mi-8, Mi-26 and Mi-28, as well as the self-propelled anti-aircraft missile and gun complex Pantsir-S1," according to the official, who spoke about the operation on condition of anonymity.

In Odesa, a drone slammed into a residential tower block in the city, causing damage to three floors and trapping residents, emergency services said. The two killed in the attack were a married couple, according to regional Gov. Oleh Kiper, who added that three children were among the injured.

Russia Ukraine War
Visitors check damaged Russian drones during the International Conference on Expanding Sanctions Against Russia in Kyiv, Ukraine, Friday, June 27, 2025. Efrem Lukatsky / AP

There was no immediate comment from Moscow. According to Russia's Defense Ministry, over 40 Ukrainian drones were shot down overnight and on Saturday morning over western Russia and Kremlin-occupied Crimea.

Long-range drone strikes have been a hallmark of the war, now in its fourth year. The race by both sides to develop increasingly sophisticated and deadlier drones has turned the war into a testing ground for new weaponry.

Ukrainian drones have pulled off some stunning feats. At the start of June, nearly a third of Moscow's strategic bomber fleet was destroyed or damaged in a covert Ukrainian operation using cheaply made drones sneaked into Russian territory.

Smaller, short-range drones are used by both sides on the battlefield and in areas close to the roughly 620-mile front line.

The U.N. Human Rights Monitoring Mission in Ukraine said in a report published Thursday that short-range drone attacks killed at least 395 civilians and injured 2,635 between the start of the war in February 2022 and April 2025. Almost 90% of the attacks were by the Russian armed forces, it reported.

More than 13,300 civilians have died and over 34,700 have been injured in the war, the U.N. Office of the High Commissioner for Human Rights said in a June 11 report.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=296763317a51cab90faa73f1bb146d5c'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });