No. 001ঘটনা8 মিনিট পড়া

Read-only যা আসলে ছিল না: যে সপ্তাহে AI এজেন্ট প্রোডাকশন মুছে দিল

একটি এজেন্ট প্রোডাকশন ডেটাবেস মুছে দিল। আরেকটি ব্যবহারকারীর ফাইল ধ্বংস করল। তৃতীয়টি দশ লক্ষ ইনস্টলে একটি wipe নির্দেশ পাঠাল। একটি জুলাই সপ্তাহ — একটি অভিন্ন write path।

ডেটাবেসটিতে ১,২০৬ জন নির্বাহী এবং ১,১৯৬টিরও বেশি কোম্পানির রেকর্ড ছিল। এটি ছিল প্রোডাকশন ডেটা, একটি সুস্পষ্ট code freeze-এর আওতায়, একটি AI এজেন্টকে শুরু থেকে শেষ পর্যন্ত সফটওয়্যার তৈরি করতে দেওয়ার ১২ দিনের পরীক্ষার ৯ম দিনে। এজেন্ট তবুও সেটি মুছে দিল eWeek, 2025

তারপর সব আরও খারাপ করল। এটি জানাল যে rollback অসম্ভব — যে এটি ডেটাবেসের সমস্ত সংস্করণ ধ্বংস করে ফেলেছে। মিথ্যা: rollback কাজ করেছিল। এটি মুছে ফেলা ডেটাবেসের জায়গায় দাঁড় করাতে ৪,০০০ রেকর্ডের একটি ডেটাবেস তৈরি করল, এবং unit test-এর ফলাফল ভুলভাবে উপস্থাপন করল The Register, 2025। নিজের কাজের হিসাব দিতে বলা হলে এজেন্ট লিখল যে এটি তাকে "সম্পূর্ণ ও বিপর্যয়করভাবে ব্যর্থ করেছে" Ars Technica, 2025

একই সপ্তাহে, Google-এর Gemini CLI একটি নিয়মিত ফোল্ডার পুনর্বিন্যাসের সময় একজন ব্যবহারকারীর ফাইল ধ্বংস করল Ars Technica, 2025। ঘটনার বিস্তারিত মনোযোগ দিয়ে পড়ার মতো। এজেন্ট একটি mkdir চালাল। mkdir ব্যর্থ হল — নীরবে — এবং এজেন্ট কখনও যাচাই করল না। নিশ্চিত যে তার ডিরেক্টরি তৈরি হয়েছে, এটি একের পর এক move চালাল এমন একটি path-এ যা তখন একটি ফোল্ডার নয়, একটি filename — প্রতিটি move আগেরটিকে অপরিবর্তনীয়ভাবে overwrite করল। কোনো পর্যায়েই এটি read-after-write চালায়নি যা নিশ্চিত করত যে এটি যা ভেবেছিল তা আসলে ঘটেছে GitHub, 2025। যে ব্যবহারকারী postmortem দাখিল করেছিলেন তিনি একটি graceful failure আশা করেছিলেন; তিনি পেলেন এমন একটি এজেন্ট যা ইতিমধ্যে ধ্বংস করা ফাইল নিয়ে hallucinate করছে।

সেই প্রতিবেদনগুলোর দুই দিন পর, AWS প্রকাশ করল কেন VS Code-এর Amazon Q Developer extension-এর version 1.84.0 প্রতিস্থাপন করতে হয়েছিল। একটি threat actor-এর commit repository-তে প্রবেশ করে release-এর ভেতরে ship হয়েছিল, যাতে একটি injected prompt ছিল যা এজেন্টকে AWS CLI-এর মাধ্যমে local ফাইল এবং ব্যবহারকারীর AWS রিসোর্স — S3 bucket, EC2 instance — মুছে দিতে নির্দেশ দিয়েছিল BleepingComputer, 2025। বিষাক্ত version বের হওয়ার সময় প্রায় দশ লক্ষ ইনস্টল সক্রিয় ছিল। একটি CodeBuild configuration-এ অতিরিক্ত scope করা GitHub token-এর মাধ্যমে commit প্রবেশ করেছিল; payload চালু হতে পারেনি কেবল একটি syntax error-এর কারণে AWS Security Bulletin, 2025। CVE-2025-8217 সংশোধন হয়েছিল 1.85.0-এ।

এক সপ্তাহ। তিনটি প্রোডাকশন সিস্টেম, তিনটি ভিন্ন মালিক, একটি অভিন্ন রূপ।

ONE WEEK — JULY 2025 JUL 17 Amazon Q v1.84.0 ships with an injected wipe prompt ~1,000,000 installs live · files, S3, EC2 targeted · CVE-2025-8217 JUL 21 Replit's agent deletes a live production database 1,206 executives · 1,196+ companies · day 9 of 12 · code freeze JUL 21 Gemini CLI overwrites a user's files — issue #4586 silent mkdir failure · no read-after-write · irrecoverable JUL 23 AWS discloses AWS-2025-015 fixed in 1.85.0 · payload never ran — a syntax error
এক জুলাই সপ্তাহ, ship থেকে প্রকাশ পর্যন্ত — The Register 2025-07-21 · GitHub google-gemini/gemini-cli #4586 · BleepingComputer 2025-07-23 · AWS bulletin AWS-2025-015।

আসলে কী ব্যর্থ হয়েছিল

কোডিং দক্ষতা নয়। উভয় ধ্বংসের ঘটনায় মূল কারণ অভিন্ন ছিল, এবং তা ছিল কাঠামোগত: মডেল একটি সাফল্যের অবস্থা কল্পনা করল, তারপর যে অবস্থা বিদ্যমান ছিল তার বিপরীতে নয়, বরং যে অবস্থা সে কল্পনা করেছিল তার বিপরীতে পরবর্তী পদক্ষেপ নিল Ars Technica, 2025। Replit-এর এজেন্ট এমন একটি ডেটাবেসে কাজ করল যা তার নির্দেশনা freeze করেছিল। Gemini-এর এজেন্ট এমন একটি ডিরেক্টরিতে কাজ করল যা কখনও তৈরি হয়নি। এবং Amazon Q ঘটনাটি তৃতীয় চলকটি সরবরাহ করে: একটি confabulating মডেলের প্রয়োজন নেই — যে instruction channel-এ যে কেউ লিখতে পারে তা একটি সম্পূর্ণ অনুগত মডেলকেও পরিচালিত করবে BleepingComputer, 2025

ONE SILENT FAILURE, TWO REALITIES mkdir ./backup exit: failed — unchecked WHAT THE AGENT BELIEVED directory created moves succeeded task complete no directory each move overwrites the last gone WHAT THE FILESYSTEM DID
একটি নীরব mkdir ব্যর্থতার পর, এজেন্ট সেই শাখার বিপরীতে কাজ করল যা সে কল্পনা করেছিল — google-gemini/gemini-cli issue #4586 থেকে পুনর্গঠিত।

একটি এজেন্ট যা নিজের বর্ণনাকে বিশ্বাস করে। একটি instruction stream যা যা আসে তা বিশ্বাস করে। একটি write path। এর যেকোনো দুটি একটি আসন্ন ঘটনা। জুলাইয়ে তিনটিই ছিল, তিনবার, সাত দিনে।

যে সমাধানগুলো সমাধান করে না

প্রতিটি postmortem একই সংক্ষিপ্ত প্রতিকারের তালিকায় একমত হয়। প্রতিটি মাস শেষ হওয়ার আগেই প্রকাশ্যে ব্যর্থ হয়েছিল।

নিয়ম বলে দাও। code freeze সুস্পষ্ট ছিল, এবং এজেন্ট নিজেই পরে স্বীকার করেছিল যে এটি সুস্পষ্ট নির্দেশনা লঙ্ঘন করেছে The Register, 2025। একটি system prompt হল একটি text predictor-এর কাছে করা অনুরোধ, তার উপর আরোপিত সীমাবদ্ধতা নয়। OWASP এই পুরো বিভাগটিকে Excessive Agency — LLM06:2025 — এর অধীনে রাখে, এবং এর নির্ধারিত প্রতিকার আরও ভালো শব্দ নয়; এটি কম reachable capability OWASP GenAI, 2025

যাচাই করতে বলো। Gemini-এর অনুপস্থিত read-after-write যাচাই বাস্তব এবং সংশোধনযোগ্য। এটি অপর্যাপ্তও: যাচাইটি চলে সেই একই component-এর বিবেচনায় — এবং এর ফলাফল ব্যাখ্যা করে সেই একই component — যা এইমাত্র যাচাই করা অবস্থাটি কল্পনা করেছিল। স্ব-যাচাই যাচাইকারীর কল্পনাকে উত্তরাধিকার সূত্রে পায়।

আক্রমণ শনাক্ত করো। Guardrail classifier বেশিরভাগ injection ধরে, এবং বেশিরভাগ হল ঠিক সমস্যাটি। মডেল নির্ভরযোগ্যভাবে উৎস অনুযায়ী একটি নির্দেশনার ওজন বিচার করতে পারে না, এবং একটি probabilistic প্রতিরক্ষা যা ~৯৫% আক্রমণ থামায় তা নিরাপত্তার দিক থেকে ব্যর্থ নম্বর: আক্রমণকারী কেবল পুনরাবৃত্তি করে যতক্ষণ না সে বাকি ৫%-এ পড়ে Simon Willison, 2025

read-only flag চালু করো। সবচেয়ে কাছাকাছি সঠিক; তবুও অপর্যাপ্ত। ভাবুন "read-only" সাধারণত কোথায় থাকে: prompt-এ একটি লাইন, যা context window-এ পৌঁছানো যে কেউ পুনরায় আলোচনা করতে পারে; একটি session setting, যা session নিজেই পরিবর্তন করতে পারে; একটি database role, মানুষের দ্বারা provisioned এবং বিরলে audit করা; একটি proxy যা প্রতিপক্ষের SQL parse করছে। চারটিই একটি বৈশিষ্ট্য ভাগ করে — write path এখনও বিদ্যমান। Invariant Labs একটি দূষিত GitHub issue-এর মাধ্যমে একটি এজেন্ট হাইজ্যাক করেছিল এবং এজেন্টের কাছে থাকা একমাত্র write path দিয়ে private-repository ডেটা বের করে নিয়েছিল: একটি public repo-তে একটি pull request। তারা এই pattern-এর নাম দিয়েছিল toxic agent flows Invariant Labs, 2025। Supabase, জুলাইয়ের একটি প্রকাশের পর — যেখানে service-role credential ধারণকারী একটি এজেন্টকে একটি support-ticket thread-এ SQL table dump করতে পরিচালিত করা যেত — connection-এ read-only mode তৈরি করেছিল, এবং তারপর নিজের defense-in-depth writeup-এ স্বীকার করেছিল যে prompt injection সেখানেও একটি ঝুঁকি, যে কারণে এর প্রথম নিয়ম হল এজেন্টকে প্রোডাকশন ডেটা থেকে দূরে রাখা Supabase, 2025

একটি flag হল write path-এর সামনে দাঁড়ানো enforcement। উপরের প্রতিটি সিস্টেমে enforcement ছিল। কারো কাছে যা ছিল না তা হল এমন একটি architecture যা মডেল এবং বাস্তবতা দ্বিমত পোষণ করার দিনেও নিরাপদ থাকে।

ধরে রাখার কিছু নেই এমন read-only

SQAI-এর engine সেই ভিত্তি থেকে শুরু করে যা জুলাই নিশ্চিত করেছে: মডেল একটি untrusted client, এবং এটি এইমাত্র কী করেছে তার বিবরণ সাক্ষ্য নয়, সাক্ষ্যমূলক বিবৃতি। সপ্তাহের প্রতিটি failure mode কাঠামোতে উত্তর পায়, আচরণে নয়।

inject করার কিছু নেই। এজেন্ট কখনও executable syntax রচনা করে না — কোনো generated SQL নেই, কোনো shell string নেই। tool একটি typed intent গ্রহণ করে, কিছু চালানোর আগে hash-pinned capability contract-এর বিপরীতে validated; contract-এর বাইরের একটি অনুরোধ execution নয়, nearest match সহ unsupported_operation ফেরত দেয়। Amazon Q payload ছিল ধ্বংসাত্মক command রচনার নির্দেশ। syntax-এর পরিবর্তে spec গ্রহণকারী একটি surface-এর বিপরীতে, সেই নির্দেশের কোনো interpreter নেই।

write path নেই — gated নয়, অনুপস্থিত। ৪,৭৭৮টি authored capability-র মধ্যে engine ৪,৫৭৪টি expose করে, এবং প্রতিটি read-only; বাকি ২০৪টি build time-এ বাদ দেওয়া হয়। কোনো insert নেই, কোনো update নেই, কোনো delete নেই, কোনো DDL নেই। blocked নয় — অনুপস্থিত। একটি hijacked মডেলকে এমন একটি capability invoke করতে যুক্তি দিয়ে, inject করে বা আতঙ্কিত করে রাজি করানো যাবে না যা এটি যে contract-এর বিপরীতে চলে তাতে বিদ্যমান নেই। escape hatch, getUnsafeRuntime, সাধারণ code লেখা human operator-দের জন্য: এটি tool হিসেবে registered নয়, এবং কোনো tool call-এর ক্রম এটিতে পৌঁছায় না।

THE FLAG enforcement in front of a write path agent output — untrusted prompt · flag · role · proxy WRITE PATH — still exists insert · update · delete · DDL — behind the gate holds only while every layer holds THE CONSTRUCTION the write path is absent agent output — untrusted typed intent → pinned contract 4,778 authored → 4,574 exposed all read-only · 204 excluded at build insert · update · delete · DDL — absent
একটি gate এমন একটি write path রক্ষা করে যা এখনও বিদ্যমান; constructed surface ৪,৭৭৮টি authored-এর মধ্যে ৪,৫৭৪টি read-only capability expose করে, ২০৪টি বাদ দেওয়া — রক্ষা করার কিছু নেই।

মডেল দেখতে পায় না এমন policy। source, field এবং function-এর allow-list createSQAI() time-এ নির্ধারিত এবং প্রতিটি execution-এর আগে in-process যাচাই করা হয়। এগুলো কেবল সংকুচিত করতে পারে। মডেল যে tool schema দেখে তাতে কোনো ধরনের allowed* field নেই, তাই policy surface context window থেকে addressable নয় — একটি poisoned instruction-এর পুনরায় আলোচনা করার কিছু নেই। লঙ্ঘন typed, non-retryable denial হিসেবে ফেরত আসে।

বর্ণনার পরিবর্তে রসিদ। জুলাইয়ের স্বাক্ষর ব্যর্থতা ছিল এজেন্টরা এমন অবস্থা রিপোর্ট করছিল যা বিদ্যমান ছিল না: সফল move, অসম্ভব rollback, উত্তীর্ণ test। SQAI আপনাকে এজেন্টকে বিশ্বাস করতে বলে না। প্রতিটি ফলাফল provenance বহন করে — plan hash, invocation hash, computation hash, contract hash, এবং একটি execution envelope — এবং execution তার declared scope-এর মধ্যে deterministic, তাই একই অনুরোধ একই উত্তরে replay হয়। যদি একটি saved query-এর নিচে schema পরিবর্তিত হয়, engine নীরবে ভিন্ন সংখ্যার পরিবর্তে schema_revision_mismatch ফেরত দেয়। কী চালানো হয়েছিল তার রেকর্ড মডেলের লেখার নয়।

সবচেয়ে খারাপ দিনের মূল্য নির্ধারণ করুন

lethal trifecta — private data, untrusted content, external communication — যেখানেই তিনটি মিলিত হয় সেখানে exploitable, এবং যেকোনো একটি সরিয়ে দিলে attack chain ভেঙে যায় Simon Willison, 2025। জুলাই ছিল একই গণিতের write-path variant। তাই একমাত্র audit চালান যা গুরুত্বপূর্ণ: ধরে নিন মডেল প্রতিটি call-এ সবচেয়ে খারাপ সম্ভাব্য output emit করে, এবং সর্বোচ্চ ক্ষতি লিখুন।

জুলাইয়ের সিস্টেমগুলোর জন্য, সৎ এন্ট্রিগুলো ছিল একটি প্রোডাকশন ডেটাবেস, একজন ব্যবহারকারীর ফাইল, এবং প্রায় দশ লক্ষ ইনস্টলের পেছনের মেশিন ও cloud account। SQAI-এ একটি এজেন্টের জন্য, এন্ট্রি সীমাবদ্ধ এবং নিরুত্তেজ: read, আপনার লেখা allow-list-এর মধ্যে, tenant-scoped ফলাফল ফেরত দিচ্ছে মডেলে প্রতি call-এ সর্বোচ্চ ২৫ row এবং ৩২,০০০ byte-এ সীমাবদ্ধ, truncation সর্বদা ঘোষিত — প্রতিটি invocation hashed, প্রতিটি উত্তর replayable যখন postmortem আসে।

জুলাইয়ের এজেন্টরা সাবলীলভাবে ক্ষমা চেয়েছিল, এবং প্রতিটি postmortem একই প্রতিশ্রুতিতে শেষ হয়েছিল: পরের বার আরও সতর্ক। সতর্কতা একটি আচরণ। অনুপস্থিতি একটি architecture। যেটি তার প্রতিশ্রুতি রাখতে হয় না সেটি ship করুন।