সরাসরি পর্বে যান
পর্ব ৪৫ · ৮০-এর মধ্যে · মডিউল ৭

Secure SDLC — নকশা থেকে release পর্যন্ত নিরাপত্তা

Secure SDLC — Security from Design to Release

Taught in Bangla, this lesson adds small security activities, each with evidence, to six stages of normal development. It covers abuse cases and testable security requirements, blocking versus advisory gates, time-limited exceptions, risk-based release decisions, finding triage and security debt, the differences between NIST SSDF, Microsoft SDL, OWASP SAMM and BSIMM, and a practical 90-day plan for a five-developer team.

এই পর্বে যা শিখবেন

  • Requirement থেকে operate পর্যন্ত প্রতিটি ধাপে কোন নিরাপত্তার কাজ, আর তার প্রমাণ কী
  • Abuse case লেখা, আর তা থেকে পরীক্ষাযোগ্য security requirement ও acceptance criteria বানানো
  • Blocking আর advisory gate-এর নকশা, মেয়াদসহ ছাড়, আর ঝুঁকিভিত্তিক release সিদ্ধান্ত
  • Finding triage, security debt আর কোন metric সত্যি কিছু বলে
  • NIST SSDF, Microsoft SDL, OWASP SAMM আর BSIMM-এর পার্থক্য
  • বাংলাদেশের ৫ জন ডেভেলপারের একটি দলের জন্য ৯০ দিনের বাস্তব পরিকল্পনা

১ · নিরাপত্তা কেন শেষে জোড়া দেওয়া যায় না

একটি পাঁচতলা কারখানা ভবনের কথা ভাবুন। নকশায় জরুরি সিঁড়ি ছিল না। ভবন শেষ হওয়ার পর পরিদর্শক বললেন, এখন সিঁড়ি লাগবে। কী হবে? দেয়াল ভাঙতে হবে, মেশিন সরাতে হবে, হয়তো ভবনের বাইরে লোহার সিঁড়ি ঝুলিয়ে কাজ চালাতে হবে। অথচ নকশার টেবিলে সিঁড়ির জায়গা রাখতে লাগত এক বেলা।

Software-এও তাই। SDLC মানে Software Development Life Cycle, অর্থাৎ একটি software-এর ধারণা থেকে অবসর পর্যন্ত পুরো জীবনপথ। আর Secure SDLC মানে সেই পথের প্রতিটি ধাপে নিরাপত্তার কাজ যুক্ত রাখা। এটি কোনো নতুন process নয়। আপনার দল Agile, Kanban বা অন্য যে পদ্ধতিতেই চলুক, সেই ধাপগুলোর ভেতরেই কাজগুলো বসে।

আগের পর্বগুলোতে দেখেছেন OWASP Top 10-এ insecure design নামে একটি আলাদা শ্রেণি আছে। নকশাতেই নিয়ন্ত্রণ না থাকলে নিখুঁত কোড দিয়েও সেই ফাঁক বন্ধ হয় না। শেষে pentest করে ধরা পড়লেও সমাধান তখন ওই লোহার সিঁড়ির মতো।

দেরির খরচ: সংখ্যাটি সৎভাবে বলা

একটি হিসাব দেখুন। ধরুন একটি অনলাইন বাজারে যে কেউ অন্যের order-এর refund চাইতে পারছেন (broken access control). ঘণ্টাগুলো আমাদের ধরে নেওয়া, কোনো গবেষণার ফল নয়।

কখন ধরা পড়লযে কাজ লাগলধরে নেওয়া ঘণ্টা
Requirement আলোচনায়দুজনের আধা ঘণ্টা কথা, একটি লাইন যোগ১
Code review-তেকোড বদল আর পরীক্ষা৩
Release-এর পরেFix ৪ + পরীক্ষা ৩ + জরুরি deploy ২ + log ঘেঁটে ক্ষতি মাপা ৮ + গ্রাহকদের জানানো ৬ + পর্যালোচনা ৪২৭

এখানে অনুপাত ২৭ : ১. কিন্তু log-এর একটি ভুল বানান release-এর পরে ধরা পড়লেও হয়তো ১০ মিনিটেই সারে। অর্থাৎ খরচ ঠিক করে ভুলটির ধরন: নকশা কতটা বদলাতে হবে, আর ক্ষতি ইতিমধ্যে ঘটেছে কি না। শুধু ক্যালেন্ডার নয়।

“১০০ গুণ” সংখ্যাটি সম্পর্কে সতর্কতা: অনেক slide-এ দেখবেন requirement-এ ১ টাকা, production-এ ১০০ টাকা, সূত্র “IBM Systems Sciences Institute”. Laurent Bossavit-এর অনুসন্ধানের কথা ২০২১ সালে The Register-ও প্রকাশ করে: দাবিটি পিছিয়ে গিয়ে ঠেকে Roger Pressman-এর ১৯৮৭ সালের বইয়ের একটি উদ্ধৃতিতে, যার উৎস ছিল কিছু কোর্সের নোট। পেছনের ডেটা পাওয়া যায়নি। তাই এই চার্টটিকে গবেষণার ফল হিসেবে উদ্ধৃত করবেন না।

Boehm ও Basili (IEEE Computer, ২০০১) লিখেছিলেন, delivery-র পরে ঠিক করা প্রায়ই ১০০ গুণ ব্যয়বহুল। সেখানেও “প্রায়ই” শব্দটি ইচ্ছাকৃত, আর ছোট system-এ গুণকটি আলাদা। অন্যদিকে Menzies ও সহলেখকদের গবেষণায় (Empirical Software Engineering, ২০১৭) ১৭১টি প্রকল্পে এই প্রভাবের চিহ্নই মেলেনি, যদিও সব প্রকল্প একই process-এ চলত, তাই নমুনাটিও সংকীর্ণ। সৎ উত্তর: দেরিতে খরচ প্রায়ই বাড়ে, কিন্তু কোনো একটি গুণক সবখানে খাটে না। নিজের দলের হিসাব রাখুন।

২ · ছয়টি ধাপ, প্রতিটিতে একটি কাজ আর একটি প্রমাণ

পদ্ধতি যাই হোক, প্রায় সব software ছয়টি ধাপ পার হয়। Agile দলে এই ছয় ধাপ দুই সপ্তাহেই একবার ঘুরে আসে, এমনকি একটি ছোট feature-এও। নিচের ছবিটি মনে রাখুন। শেষের তীরটিই সবচেয়ে গুরুত্বপূর্ণ: operate থেকে শেখা জিনিস আবার requirement-এ ফেরে।

Secure SDLC-র ছয় ধাপ আর শেখার ফিরতি পথ

Six phases, each with one security activity, and a feedback loop

Secure SDLC-র ছয় ধাপ Requirement Abuse case, acceptance criteria Design Threat model, নিরাপদ নকশা Implementation Secure coding, code review Verification নিরাপত্তা পরীক্ষা, gate Release Sign-off, SBOM, ফেরার পথ Operate Monitoring, patch, disclosure শেখা ফিরে আসে
ছবি ৪৫.১ — ধাপগুলো একবারের সিঁড়ি নয়, একটি চক্র। ঘটনা থেকে পাওয়া শিক্ষা পরের requirement হয়ে ফেরে।
ধাপনিরাপত্তার কাজপ্রমাণকোথায় বিস্তারিত
RequirementAbuse case, ডেটার শ্রেণি, আইনি প্রয়োজনStory-তে acceptance criteriaএই পর্বের অংশ ৩
DesignThreat modeling, trust boundary, নিরাপদ pattern বাছাইছোট threat model, সিদ্ধান্তের নোটপর্ব ৪, নিরাপদ system design
ImplementationSecure coding, code review, secret-এর শৃঙ্খলাReview করা PRপর্ব ৪৬, code review
VerificationSAST, SCA, DAST, abuse-এর পরীক্ষাপরীক্ষার ফল, finding-এর তালিকাপর্ব ৪৯, DevSecOps
ReleaseSign-off, SBOM, ঝুঁকির সিদ্ধান্ত, rollback প্রস্তুতস্বাক্ষরিত সিদ্ধান্ত, SBOM ফাইলঅংশ ৬, পর্ব ৪৮
OperateMonitoring, patch, disclosure, incident সাড়াAlert, patch-এর রেকর্ড, security.txtপর্ব ৩২, পর্ব ৬১

“প্রমাণ” কলামটি ইচ্ছা করে রাখা। কাজ হয়েছে বলার চেয়ে দেখাতে পারা ভালো: ছয় মাস পরে কেউ জিজ্ঞেস করলে একটি লিংক খুললেই উত্তর মিলবে। প্রমাণ মানে মোটা নথি নয়। একটি ticket-এর দুই লাইনও প্রমাণ।

নিচে একটি কাল্পনিক অনলাইন বাজারের একটি feature, “গ্রাহক refund চাইবেন”, পুরো পথ পার হচ্ছে। “খোলা ঝুঁকি” সারিটি খেয়াল করুন।

Refund feature-এর অবস্থা
ধাপ
নিরাপত্তার কাজ
জানা ঝুঁকি
খোলা ঝুঁকি
প্রমাণ
  1. Requirement. “গ্রাহক refund চাইবেন” লেখার সাথে দুটি প্রশ্ন করা হলো: কেউ অন্যের order-এ চাইলে কী হবে? একই refund দুবার গেলে কী হবে? দুটি abuse case ticket-এ উঠল। জানা ঝুঁকি ২টি, দুটিই খোলা।
  2. Design. ৩০ মিনিটের আলোচনায় তৃতীয় ঝুঁকি বেরোল: support কর্মী সীমাহীন refund দিতে পারেন। সিদ্ধান্ত হলো server-এ মালিকানা যাচাই, প্রতি অনুরোধে একটি idempotency key, আর বড় অঙ্কে দ্বিতীয় জনের অনুমোদন। ঝুঁকি এখন ৩টি।
  3. Implementation. দলের ঠিক করা authorization middleware দিয়ে কোড লেখা হলো, একজন সহকর্মী review করলেন। নিয়ন্ত্রণ তিনটি বসেছে, কিন্তু কাজ করছে তার প্রমাণ এখনো নেই। তাই ৩টিই খোলা।
  4. Verification. Abuse test চলল। দ্বিতীয় অনুরোধ retry হলে দুবার refund যাচ্ছিল, পরীক্ষাটি ব্যর্থ হলো। Key-র যাচাই সারিয়ে আবার চালানো হলো, সব পাস। এবার ৩টি ঝুঁকিই প্রমাণসহ বন্ধ, তাই খোলা ঝুঁকি ০টি।
  5. Release. Product owner আর dev lead সই দিলেন, SBOM রাখা হলো। Feature flag দিয়ে প্রথমে ১০% গ্রাহকের জন্য খোলা হলো (staged rollout), সমস্যা হলে flag বন্ধ করলেই ফেরা যায়।
  6. Operate. ঘণ্টায় refund-এর সংখ্যা হঠাৎ বাড়লে alert যাবে। Dependency-র patch আসবে, বাইরের কেউ ত্রুটি পেলে জানানোর পথ আছে। নতুন কোনো abuse দেখা গেলে সেটি পরের sprint-এর requirement হবে। ঝুঁকি শূন্য নয়, জানা ঝুঁকি বন্ধ আছে আর নজরে আছে।

৩ · Requirement — abuse case আর পরীক্ষাযোগ্য শর্ত

ব্যাংকে নতুন চেক বই চালু করার আগে কর্মকর্তা শুধু ভাবেন না “গ্রাহক কীভাবে চেক লিখবেন”, ভাবেন “কেউ জাল সই করলে কী হবে”। Requirement-এর সাধারণ ভাষা বলে সিস্টেম কী করবে। Abuse case বলে কী করতে দেবে না। এটি ডেভেলপারের কাজের নকশা নয়, ক্ষতির পরিস্থিতির একটি লিখিত বর্ণনা, যাতে আগেভাগে বাধা বসানো যায়।

শব্দের পার্থক্য: McDermott ও Fox (ACSAC, ১৯৯৯) “abuse case” শব্দটি জনপ্রিয় করেন, আর Sindre ও Opdahl “misuse case”. কেউ কেউ বলেন misuse মানে ভুল ব্যবহার, abuse মানে ইচ্ছাকৃত ক্ষতি। আবার অনেকে দুটিকে একই অর্থে বলেন। এই পর্বে আমরা ইচ্ছাকৃত ও অসাবধান, দুটিকেই abuse case বলছি। সংজ্ঞা মুখস্থের চেয়ে প্রশ্নটি করা জরুরি।

প্রতিটি নতুন feature-এ চারটি প্রশ্নই যথেষ্ট: (১) এখানে কার ডেটা বা টাকা আছে? (২) অন্য একজন ব্যবহারকারী এটি করলে কী হবে? (৩) একই কাজ হাজারবার হলে কী হবে? (৪) ভেতরের কর্মী ভুল করলে বা অসৎ হলে কী হবে? এই আলোচনা user story লেখার সময়েই হয়, আলাদা সভা লাগে না।

এরপর আসে security requirement. শুধু “সিস্টেম নিরাপদ হবে” কোনো requirement নয়, কারণ পরীক্ষা করা যায় না। প্রতিটি শর্তকে এমন হতে হবে, যাতে কেউ পাস বা ফেল বলতে পারেন। এই শর্তকে বলে acceptance criteria. তৈরি তালিকা চাইলে OWASP-এর ASVS ভালো শুরু, তবে পুরোটা নয়, নিজের ঝুঁকির সাথে মেলে এমন অংশ নিন।

দুর্বল লেখাপরীক্ষাযোগ্য শর্ত
অন্যের ডেটা দেখা যাবে নাUser A, user B-র order চাইলে server 403 দেবে, আর response-এ B-র কোনো তথ্য থাকবে না
Refund নিরাপদ হবেএকই idempotency key-তে দ্বিতীয় অনুরোধ balance বদলাবে না
OTP-র অপব্যবহার ঠেকাতে হবেএকটি নম্বরে ১০ মিনিটে ৫ বারের বেশি OTP যাবে না, ষষ্ঠ অনুরোধে 429
Password শক্ত হবেপর্ব ১৩-এর মতো Argon2 বা bcrypt-এ রাখা, আর plaintext কোনো log-এ থাকবে না

নিচের খেলনা কোড tag দেওয়া requirement থেকে পরীক্ষার ধারণা বানায়। এটি কোনো সিস্টেম স্পর্শ করে না, শুধু লেখা তৈরি করে। Tag-এর catalogue দলের নিজের অভিজ্ঞতা থেকে বড় হয়।

// Toy generator: turns tagged requirements into abuse cases and test ideas.
const requirements = [
  { id: 'R1', text: 'Customer views own order', tags: ['owner-data'] },
  { id: 'R2', text: 'Customer requests a refund', tags: ['owner-data', 'money'] },
  { id: 'R3', text: 'Guest asks for a login OTP', tags: ['public-cost'] },
  { id: 'R4', text: 'Seller uploads a product file', tags: ['file'] },
  { id: 'R5', text: 'Support exports customer list', tags: [] },
];
const catalogue = {
  'owner-data': ['user A asks for a record of user B', 'server returns 403; nothing leaks'],
  'money': ['same refund is sent twice', 'second request changes no balance'],
  'public-cost': ['one number asks many times', 'limit hits; request 6 gets 429'],
  'file': ['file type differs from its name', 'server rejects it and logs the event'],
};
let total = 0;
const needHuman = [];
for (const r of requirements) {
  console.log(`${r.id} ${r.text}`);
  if (r.tags.length === 0) needHuman.push(r.id);
  for (const tag of r.tags) {
    const [abuse, expected] = catalogue[tag];
    total++;
    console.log(`  T${total} [${tag}]`);
    console.log(`     Given/When: ${abuse}`);
    console.log(`     Then: ${expected}`);
  }
}
console.log('--');
console.log(`requirements=${requirements.length} tests=${total}`);
console.log(`no tag, human review needed: ${needHuman.join(', ') || 'none'}`);

আউটপুট:

R1 Customer views own order
  T1 [owner-data]
     Given/When: user A asks for a record of user B
     Then: server returns 403; nothing leaks
R2 Customer requests a refund
  T2 [owner-data]
     Given/When: user A asks for a record of user B
     Then: server returns 403; nothing leaks
  T3 [money]
     Given/When: same refund is sent twice
     Then: second request changes no balance
R3 Guest asks for a login OTP
  T4 [public-cost]
     Given/When: one number asks many times
     Then: limit hits; request 6 gets 429
R4 Seller uploads a product file
  T5 [file]
     Given/When: file type differs from its name
     Then: server rejects it and logs the event
R5 Support exports customer list
--
requirements=5 tests=5
no tag, human review needed: R5

৫টি requirement থেকে ৫টি পরীক্ষার ধারণা এলো। R2-তে দুটি tag, তাই দুটি পরীক্ষা। সবচেয়ে কাজের লাইনটি শেষেরটি: R5-এ কোনো tag নেই, অথচ পুরো গ্রাহক তালিকা export করা হয়তো সবচেয়ে ঝুঁকিপূর্ণ কাজ। Generator যা জানে না, তা ধরতে পারে না। তাই সে নীরব না থেকে মানুষের কাছে পাঠিয়েছে। শিক্ষা: টেমপ্লেট বিচারবুদ্ধির জায়গা নেয় না, মনে করিয়ে দেয়।

৪ · Shift left, কিন্তু বোঝা না বাড়িয়ে

Shift left মানে নিরাপত্তার কাজ পথের শুরুর দিকে সরানো। পরিকল্পনার ছবিতে কাজটি বাঁ দিকে যায়, তাই এই নাম। উদ্দেশ্য ভালো। কিন্তু খারাপভাবে করলে এর মানে দাঁড়ায়: ডেভেলপারের ঘাড়ে শত শত alert আর ৫০ লাইনের checklist চাপিয়ে দেওয়া। তখন মানুষ পথ এড়িয়ে যান। সমস্যাটি অলসতা নয়, নকশার।

ঢাকায় রাস্তা পার হওয়ার কথা ভাবুন। ওভারব্রিজ যদি দূরে আর ভাঙা হয়, “রাস্তা পার হবেন না” সাইনবোর্ডে কেউ থামেন না। ব্রিজটি ঠিক জায়গায় আর সহজ হলে মানুষ নিজেই ওপরে ওঠেন। নিরাপদ পথ যদি সবচেয়ে সহজ পথ হয়, নিয়ম মনে করিয়ে দিতে হয় না। এটিই পুরো অংশের মূল কথা, আর এটি পর্ব ৩-এর psychological acceptability নীতিরই বাস্তব রূপ।

Secure default

Secure by default মানে কিছু না করলেও নিরাপদ অবস্থা। Template নিজে encode করে, ORM নিজে parameterized query বানায়, route ডিফল্টে login চায়।

মনে রাখতে হয় না

Paved road

Paved road হলো দলের বানানো পাকা রাস্তা: তৈরি project template, login library, logging, CI পরীক্ষা। এই পথে চললে review কমে। অন্য পথে যাওয়া নিষেধ নয়, তবে তখন প্রমাণ দিতে হয়।

Netflix-এর জনপ্রিয় করা ধারণা

দ্রুত, প্রাসঙ্গিক feedback

Finding আসে PR-এর সেই লাইনেই, সমাধানের ইঙ্গিতসহ। আলাদা PDF রিপোর্টে তিন সপ্তাহ পরে নয়। Tool-এর false positive আপনার সময় খায়, তাই rule ছাঁটাই করাও কাজ।

কম, কিন্তু কাজের

Security champion

Security champion হলেন দলের একজন ডেভেলপার, যিনি নিরাপত্তায় বাড়তি আগ্রহ রাখেন। তিনি পুলিশ নন, অনুবাদক। দলের প্রশ্ন শোনেন, ঝুঁকিপূর্ণ PR চিনিয়ে দেন।

সময় বরাদ্দ জরুরি

Design ধাপে সব feature-এর threat model লাগে না। একটি সহজ trigger রাখুন: টাকা, ব্যক্তিগত ডেটা, login বা অনুমতি, নতুন বাইরের integration, অথবা নতুন public endpoint ছুঁলে ৩০ মিনিটের threat model. বাকি ছোট কাজ সরাসরি যায়। Review-তে দুই স্তর কাজ করে: সাধারণ PR-এ সহকর্মী, আর auth/ বা payment/ ফোল্ডার ছুঁলে champion-কে বাধ্যতামূলক reviewer করে দেওয়া।

Champion-এর সাধারণ ভুল: সবচেয়ে আগ্রহী ডেভেলপারকে উপাধি দিয়ে পুরো নিরাপত্তা তাঁর কাঁধে দেওয়া। Sprint-এ তাঁর কোনো সময় বরাদ্দ নেই, তাই তিনি রাতে কাজ করেন, আর তিনি চাকরি ছাড়লে সব জ্ঞান চলে যায়। সমাধান: লিখিত সময় বরাদ্দ, ছয় মাস পরপর ভূমিকা বদল, আর নিরাপত্তার দায় পুরো দলের, এই কথাটি পরিষ্কার রাখা।

৫ · Security gate — blocking না advisory

মেট্রো স্টেশনের গেট দুই রকম আচরণ করে। টিকিট না থাকলে দরজা খোলে না। আর ব্যাগে সন্দেহজনক কিছু দেখলে কর্মী দেখে ছেড়ে দেন। Software-এর security gate-ও তাই। Pipeline-এর কোনো ধাপের পরীক্ষার ফল দেখে সে সিদ্ধান্ত দেয়: এগোবে কি না।

Pipeline-এর কলকবজা, কোন ধাপে কোন tool, token আর pinning নিয়ে এখানে কথা বলব না। সেসব আছে DevSecOps পর্বে আর Continuous Integration পর্বে। আমরা দেখব নীতি: কোন জিনিসে থামাবেন, কে ছাড় দেবেন।

Blocking gateAdvisory gate
আচরণBuild থামায়, merge বা release আটকায়জানায়, PR-এ মন্তব্য করে, ticket বানায়, থামায় না
কখন ঠিকনিশ্চিত, গুরুতর, সমাধানযোগ্য জিনিস: নতুন secret, পৌঁছানো যায় এমন নতুন high ত্রুটিনতুন rule-এর শুরুর দিন, মাঝারি finding, পুরোনো ঋণ
ঝুঁকিFalse positive বেশি হলে মানুষ gate এড়ানোর পথ খোঁজেনকেউ না দেখলে শুধু শব্দ হয়ে থাকে
কীভাবে শুরুকয়েক সপ্তাহ advisory-তে চালিয়ে মান দেখে তবেইপ্রতিটি নতুন rule এখান থেকে শুরু

একটি ভালো নীতির চারটি অংশ: নতুন জিনিসে থামান, পুরোনো ঋণে নয়, যাতে আজকের PR-এর লেখক গত বছরের দায় না নেন। পৌঁছানো যায় এমন জিনিসে থামান। সমাধানের পথ থাকতে হবে। আর সিদ্ধান্তটি policy as code হিসেবে repository-তে থাকবে, যাতে নীতিও review হয়। ছাড় সম্ভব, কিন্তু গোপন বা স্থায়ী নয়। নিচের খেলনা evaluator তাই করে। Build-এর ফল পাতার ভেতরের object, কিছুই scan হচ্ছে না, আর তারিখ simulated.

// Toy security gate on in-memory build results. Nothing is scanned.
const exceptions = [
  { id: 'EX-7', finding: 'F5', expires: '2026-11-30', owner: 'CTO' },
];
const heavy = ['critical', 'high'];
function decide(f, today) {
  if (f.kind === 'secret') return ['BLOCK', 'secret: no exception allowed'];
  if (!heavy.includes(f.sev)) return ['ADVISE', 'below blocking severity'];
  if (!f.isNew) return ['ADVISE', 'old debt: tracked on the board'];
  if (!f.reachable) return ['ADVISE', 'not reachable: review later'];
  const ex = exceptions.find(e => e.finding === f.id);
  if (ex && today <= ex.expires) return ['PASS*', `${ex.id} until ${ex.expires}`];
  if (ex) return ['BLOCK', `${ex.id} expired on ${ex.expires}`];
  return ['BLOCK', 'new, reachable, serious'];
}
const builds = [
  { id: 101, today: '2026-11-02', findings: [
    { id: 'F1', kind: 'sast', sev: 'high', isNew: true, reachable: true },
    { id: 'F2', kind: 'sca', sev: 'medium', isNew: true, reachable: true },
    { id: 'F3', kind: 'secret', sev: 'high', isNew: true, reachable: true } ] },
  { id: 102, today: '2026-11-03', findings: [
    { id: 'F2', kind: 'sca', sev: 'medium', isNew: true, reachable: true },
    { id: 'F4', kind: 'sca', sev: 'critical', isNew: false, reachable: true } ] },
  { id: 103, today: '2026-11-20', findings: [
    { id: 'F5', kind: 'sca', sev: 'high', isNew: true, reachable: true } ] },
  { id: 104, today: '2026-12-01', findings: [
    { id: 'F5', kind: 'sca', sev: 'high', isNew: true, reachable: true } ] },
];
for (const b of builds) {
  const rows = b.findings.map(f => [f.id, ...decide(f, b.today)]);
  const failed = rows.some(r => r[1] === 'BLOCK');
  console.log(`build ${b.id} (${b.today}): ${failed ? 'FAILED' : 'PASSED'}`);
  rows.forEach(r => console.log(`  ${r[0]} ${r[1].padEnd(6)} ${r[2]}`));
}

আউটপুট:

build 101 (2026-11-02): FAILED
  F1 BLOCK  new, reachable, serious
  F2 ADVISE below blocking severity
  F3 BLOCK  secret: no exception allowed
build 102 (2026-11-03): PASSED
  F2 ADVISE below blocking severity
  F4 ADVISE old debt: tracked on the board
build 103 (2026-11-20): PASSED
  F5 PASS*  EX-7 until 2026-11-30
build 104 (2026-12-01): FAILED
  F5 BLOCK  EX-7 expired on 2026-11-30

Build 101 দুই কারণে ব্যর্থ। F1 নতুন, পৌঁছানো যায়, আর গুরুতর। F3 একটি secret, যা severity যাই হোক সবার আগে আটকায়, আর ছাড়ও নেই, কারণ ফাঁস হওয়া key-র একমাত্র ওষুধ বদলানো। Build 102-তে F4 critical, তবু পাস করল, কারণ এটি পুরোনো। তার মানে এটি নিরাপদ নয়, মানে এটি এই PR-এর লেখকের দোষ নয়। F4 দলের বোর্ডে থাকবে, আর অংশ ৭-এর ঋণের হিসাবে গুনবে। Build 103 আর 104-এর finding একই, কোডও একই, শুধু তারিখ আলাদা: ছাড়ের মেয়াদ শেষ হতেই gate আবার থামাল। মেয়াদ নিজে থেকে কাজ করছে, কাউকে মনে রাখতে হচ্ছে না।

এবার দেখুন gate ব্যর্থ হলে একজন ডেভেলপারের দিনটি কেমন যায়। এটি ওপরের build 101 থেকে build 102-তে যাওয়ার গল্প।

build 101PR: refund feature
FAILED
F1 BLOCK  sast   high   query built by joining strings
F2 ADVISE sca    medium library update available
F3 BLOCK  secret high   key pattern in config file
Triageডেভেলপার আর champion
F1  real: input reaches the query    -> fix now
F2  real: small update               -> ticket, 30 days
F3  real: test key, but a live one   -> treat as leaked
F1 সারানোUnsafe pattern বনাম safe pattern
// before: text is joined into the query
// sql = "... WHERE id = " + <user-input>
// after: the value travels separately
// sql = "... WHERE id = ?", params = [orderId]
+ regression test for the same input path
F3 সারানোমোছা যথেষ্ট নয়
1. revoke the old key        done
2. issue a new key           done
3. store it in the vault     done
4. check access logs         no unknown use
5. remove from config        done
build 102পুনরায় চালানো
PASSED
F2 ADVISE below blocking severity
F4 ADVISE old debt: tracked on the board
Merge-এর পরেএকই ভুল যেন না ফেরে
TICKET-212  F2 update library    due 30 days
TICKET-213  pre-commit secret check for all repos
NOTE        F1 pattern added to review notes
  1. Gate থামাল। PR-এ লাল চিহ্ন এলো। দুটি BLOCK, একটি ADVISE. প্রতিটি লাইনে কারণ লেখা আছে, তাই ডেভেলপারকে কাউকে ফোন করতে হলো না। ভালো gate শুধু “না” বলে না, কেন না, তাও বলে।
  2. Triage. ডেভেলপার champion-কে নিয়ে ১০ মিনিট দেখলেন। F1 সত্যি, ব্যবহারকারীর ইনপুট query পর্যন্ত যায়। F3 “test key” ছিল, কিন্তু সেটি চালু। তাই এটিকে ফাঁস হওয়া ধরে নেওয়া হলো।
  3. F1 সারানো। Query জোড়া দেওয়ার বদলে মান আলাদা করে পাঠানো হলো (পর্ব ৩৯)। সাথে একটি regression test, যাতে একই ভুল আর না ফেরে।
  4. F3 সারানো। আগে key বাতিল, পরে নতুন key, তারপর vault-এ রাখা। Log দেখে নিশ্চিত হওয়া হলো অজানা ব্যবহার নেই। শুধু ফাইল থেকে মুছলে কাজ হতো না, কারণ key ইতিহাসে থেকে যায় (Git নিরাপত্তা)।
  5. আবার চালানো। Build 102 পাস করল। F2 আর F4 রয়ে গেছে ADVISE হয়ে। Gate পাস মানে ত্রুটিহীন নয়, মানে আপনার নীতির সীমার মধ্যে আছে।
  6. ভুলটি পদ্ধতিতে ফেরানো। F2-র ticket হলো ৩০ দিনের সীমায়। Secret আরও আগে, commit-এর আগেই ধরার কাজ যোগ হলো। F1-এর pattern review-এর নোটে উঠল। মোট সময় গেল কয়েক ঘণ্টা, আর গ্রাহক কিছুই টের পেলেন না।

৬ · Release আর operate — ঝুঁকি বুঝে সিদ্ধান্ত

Release-এ এসে প্রশ্নটি “ত্রুটি আছে কি” নয়। ত্রুটি প্রায় সবসময় থাকে। প্রশ্ন হলো “জানা ঝুঁকিগুলো নিয়ে আমরা কি এখন যেতে রাজি, আর সেই সিদ্ধান্ত কার?” Sign-off মানে একজন দায়িত্বশীল মানুষের নাম ওই সিদ্ধান্তের পাশে থাকা। ডেভেলপার নিজে ঝুঁকি গ্রহণ করেন না। ব্যবসার সেই অংশের মালিক, অর্থাৎ risk owner, করেন, কারণ ক্ষতি হলে তাঁকেই জবাব দিতে হবে।

কাজের একটি হিসাব দেখুন। সংখ্যাগুলো ধরে নেওয়া। একটি high finding আছে, library-র fix এখনো নেই। Release ৩০ দিন পেছালে ব্যবসার ক্ষতি ৳৩,০০,০০০. ঘটনা ঘটলে ক্ষতি ৳৫০,০০,০০০. ঘটার সম্ভাবনা মাসে ২%, আর WAF rule আর feature সীমা (compensating control) দিলে ০.৫%.

প্রত্যাশিত ক্ষতি = সম্ভাবনা × ক্ষতি
০.০২ × ৫০,০০,০০০ = ৳১,০০,০০০  ·  ০.০০৫ × ৫০,০০,০০০ = ৳২৫,০০০
সমান হওয়ার বিন্দু: ৩,০০,০০০ ÷ ৫০,০০,০০০ = ৬%

এই হিসাবে নিয়ন্ত্রণসহ release করাই যৌক্তিক: ৳২৫,০০০ বনাম ৳৩,০০,০০০. আর সমান হওয়ার বিন্দুটি আসল কথা বলে। আসল মাসিক সম্ভাবনা ৬%-এর বেশি হলে সিদ্ধান্ত উল্টে যায়। কিন্তু সতর্ক থাকুন: সম্ভাবনার অনুমান প্রায়ই আন্দাজ (risk-এর সূত্র নিয়ে মতভেদও আছে, দেখুন পর্ব ২)। Exploit প্রকাশ্য হলে, যেমন ত্রুটিটি KEV তালিকায় এলে, সংখ্যাটি রাতারাতি বদলায়। আর কিছু জিনিস টাকায় মাপা যায় না: মানুষের ব্যক্তিগত ডেটা, নিরাপত্তা-সংকটাপন্ন কাজ, আইনি দায়। সেখানে মানুষের বিচারই শেষ কথা।

এই সিদ্ধান্তের লিখিত রূপই risk exception. এতে পাঁচটি জিনিস থাকতে হবে: কোন finding, কেন এখন ঠিক করা যাচ্ছে না, কোন সুরক্ষা বসানো হলো, কে অনুমোদন করলেন, আর কবে মেয়াদ শেষ। মেয়াদ নেই এমন ছাড় আসলে ছাড় নয়, নীরবে নেওয়া risk acceptance. সব ছাড় একটি risk register-এ থাকে। নিচে EX-7-এর পুরো জীবন দেখুন, যা ওপরের কোডের সেই ছাড়।

EX-7 · finding F5 (high, library, fix নেই)
তারিখ
ছাড়ের অবস্থা
মালিক
সুরক্ষা
Gate
  1. Finding এলো। ৩ নভেম্বর SCA জানাল একটি library-তে high ত্রুটি, fix এখনো প্রকাশ হয়নি। Gate থামাল। অপেক্ষা করলে বছর শেষের অফার ধরা যাবে না।
  2. লিখিত আবেদন। Dev lead লিখলেন: কোন finding, কেন এখন সারানো যাচ্ছে না, কোন পথে পৌঁছানো যায়, আর কোন সুরক্ষা বসবে। অনুমোদন না হওয়া পর্যন্ত gate এখনো BLOCK.
  3. অনুমোদন। CTO ঝুঁকিটি নিজের নামে নিলেন। মেয়াদ ৩০ নভেম্বর, অর্থাৎ ২৭ দিন। Register-এ EX-7 উঠল। Gate-এ ফল এখন PASS*, তারকাটি মনে করিয়ে দেয় এটি শর্তসাপেক্ষ পাস।
  4. মাঝপথের যাচাই। ২০ নভেম্বরের build 103 পাস করল। Champion দেখলেন WAF rule সত্যি চলছে কি না। Compensating control কাগজে থাকলে চলে না, তাকেও পরীক্ষা করতে হয়।
  5. স্মরণ করানো। মেয়াদের ৭ দিন আগে ২৩ নভেম্বর স্বয়ংক্রিয় বার্তা গেল। এর মধ্যে library-র fix প্রকাশ হয়েছে। Ticket তৈরি হলো, কিন্তু অন্য কাজের চাপে পড়ে রইল।
  6. মেয়াদ শেষ। ১ ডিসেম্বরের build 104 থেমে গেল। ঠিক এটিই নকশার উদ্দেশ্য। মেয়াদ বাড়াতে হলে নতুন করে অনুমোদন লাগবে, নিজে থেকে বাড়ে না। ভুলে থাকা ছাড় এখানেই ধরা পড়ে।
  7. বন্ধ। ২ ডিসেম্বর library update হলো, F5 চলে গেল, EX-7 বন্ধ। Register-এ রেকর্ডটি থেকে যায়, যাতে পরে দেখা যায় কতদিন ঝুঁকি খোলা ছিল। WAF rule-টিও সরানো হলো, কারণ অপ্রয়োজনীয় rule নিজেই জটিলতা।

Release-এর ছোট checklist

Operate: কাজ এখানে শেষ হয় না

চালু হওয়ার পরের তিনটি অভ্যাস। Monitoring: login ব্যর্থতা, refund-এর হার, অনুমতির 403 বেড়ে যাওয়া, এগুলো নিরাপত্তার সংকেত। Patch: dependency আর server-এর জন্য পর্ব ৩২-এর অগ্রাধিকার। CVSS-এর সাথে KEV আর EPSS মিলিয়ে দেখুন। Disclosure: বাইরের কেউ ত্রুটি পেলে কোথায় জানাবেন, তা পর্ব ৬-এর coordinated disclosure মেনে ঠিক রাখুন। Site-এ একটি security.txt (RFC 9116, ২০২২) রাখা সবচেয়ে সস্তা শুরু। দরকার হলে গ্রাহকদের জন্য security advisory প্রকাশ করুন। আর ঘটনা ঘটলে incident management-এর পথ ধরুন, যার পূর্ণ আলোচনা পর্ব ৬১-এ।

৭ · Finding, triage আর security debt

Tool চালালেই শত শত finding আসে। এগুলো হাসপাতালের জরুরি বিভাগের রোগীর মতো। যিনি আগে এলেন তিনি আগে নন, যাঁর অবস্থা গুরুতর তিনি আগে। এই বাছাইকে বলে finding triage. প্রতিটি finding-এর জন্য চারটি প্রশ্ন: এটি সত্যি কি? পৌঁছানো যায় কি? ক্ষতি কতটা? কে সারাবেন, কবে?

ফল হতে পারে পাঁচটি: এখনই সারানো, সময়সীমা দিয়ে ticket, false positive (কারণসহ বন্ধ, যাতে rule ঠিক করা যায়), প্রযোজ্য নয়, অথবা মেয়াদসহ ছাড়। কোনো finding মালিকহীন থাকবে না, এটিই একমাত্র কঠোর নিয়ম। Microsoft-এর SDL-এ এমন স্থির মানকে বলা হয় bug bar: কোন শ্রেণির ত্রুটি নিয়ে release হবে না, তা আগেই ঠিক থাকে, যাতে চাপের সময় তর্ক না হয়।

না সারানো finding জমে হয় security debt. এটি technical debt-এর মতো ঋণ, পার্থক্য হলো এর সুদ হঠাৎ একদিনে চাইতে পারে। বাকিতে চা খাওয়ার খাতা ভাবুন। দোকানদার প্রতিদিন চান না, কিন্তু খাতাটি না দেখলে একদিন অঙ্ক দেখে চমকে যাবেন। নিচের খেলনা কোড seed করা PRNG দিয়ে ৬০টি কাল্পনিক finding বানায়, আর ১৮০ দিনের simulated হিসাব দেখায়। SLA আর পয়েন্ট দলের ধরে নেওয়া নীতি, কোনো standard নয়।

// Toy finding ageing with a seeded PRNG and a simulated calendar (day numbers).
function mulberry32(a) {
  return () => { a = (a + 0x6D2B79F5) | 0; let t = Math.imul(a ^ (a >>> 15), 1 | a);
    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296; };
}
const rand = mulberry32(45);
const SLA = { critical: 7, high: 30, medium: 90 };   // assumed team policy, in days
const WEIGHT = { critical: 10, high: 3, medium: 1 }; // assumed debt points
const sevs = ['critical', 'high', 'high', 'medium', 'medium', 'medium'];
const findings = [];
for (let i = 0; i < 60; i++) {
  const sev = sevs[Math.floor(rand() * sevs.length)];
  const opened = 1 + Math.floor(rand() * 180);
  const fixDays = Math.floor(rand() * 2.2 * SLA[sev]);
  findings.push({ sev, opened, closed: rand() < 0.2 ? null : opened + fixDays });
}
console.log('day  opened  closed  open  overdue  debt  oldest');
for (const day of [30, 60, 90, 120, 150, 180]) {
  const seen = findings.filter(f => f.opened <= day);
  const open = seen.filter(f => f.closed === null || f.closed > day);
  const overdue = open.filter(f => day - f.opened > SLA[f.sev]);
  const debt = overdue.reduce((sum, f) => sum + WEIGHT[f.sev], 0);
  const oldest = Math.max(0, ...open.map(f => day - f.opened));
  console.log([day, seen.length, seen.length - open.length, open.length, overdue.length, debt, oldest]
    .map(v => String(v).padEnd(6)).join(' ').trimEnd());
}
const done = findings.filter(f => f.closed !== null && f.closed <= 180);
const within = done.filter(f => f.closed - f.opened <= SLA[f.sev]).length;
const median = xs => { const s = [...xs].sort((a, b) => a - b); return s[Math.floor(s.length / 2)]; };
console.log(`closed in time: ${within}/${done.length} = ${(100 * within / done.length).toFixed(1)}%`);
for (const sev of Object.keys(SLA)) {
  const days = done.filter(f => f.sev === sev).map(f => f.closed - f.opened);
  console.log(`median days to fix ${sev}: ${median(days)} (n=${days.length}, SLA ${SLA[sev]})`);
}

আউটপুট:

day  opened  closed  open  overdue  debt  oldest
30     8      2      6      2      20     28
60     17     6      11     2      20     58
90     26     12     14     5      36     88
120    38     14     24     8      39     118
150    51     25     26     9      44     148
180    60     33     27     12     47     178
closed in time: 21/33 = 63.6%
median days to fix critical: 7 (n=9, SLA 7)
median days to fix high: 28 (n=16, SLA 30)
median days to fix medium: 42 (n=8, SLA 90)

শেষের median লাইনগুলো দেখলে দলকে ভালো মনে হয়: critical ৭ দিন, high ২৮ দিন, দুটিই SLA-এর ভেতরে। কিন্তু ওপরের টেবিল অন্য কথা বলে। খোলা finding ৬ থেকে ২৭-এ গেছে, overdue ২ থেকে ১২-তে, debt পয়েন্ট ২০ থেকে ৪৭-এ, আর সবচেয়ে পুরোনোটির বয়স ১৭৮ দিন। সময়মতো বন্ধ হয়েছে ৩৩টির ২১টি, অর্থাৎ ৬৩.৬%. কারণ median শুধু বন্ধ হওয়া finding গোনে। যেগুলো কখনো বন্ধ হয়নি, সেগুলো হিসাবের বাইরে থাকে। শিক্ষা: finding ageing না দেখলে গড় আপনাকে মিথ্যা সান্ত্বনা দেবে। এখানে এসেছে ৬০টি, বন্ধ ৩৩টি। আগমনের হার বন্ধের হারের চেয়ে বেশি থাকলে ঋণ বাড়বেই, যত ভালোই fix করুন।

কোন metric কাজের

Metricকী বলেউদাহরণ হিসাব
SLA মানাকত finding সময়মতো বন্ধ২১ ÷ ৩৩ = ৬৩.৬%
Escape rateকত ত্রুটি release-এর পরে ধরা পড়ল৬ ÷ (৩৪ + ৬) = ১৫%
আগমন বনাম বন্ধঋণ বাড়ছে না কমছে৬০ এলো, ৩৩ বন্ধ
সবচেয়ে পুরোনো খোলা findingভুলে যাওয়া জিনিস১৭৮ দিন
মেয়াদোত্তীর্ণ ছাড়Register মানা হচ্ছে কি নালক্ষ্য ০
Paved road-এ থাকা serviceনিরাপদ পথ কতটা গ্রহণ হলো৭ ÷ ১০ = ৭০%
Gate-এর false positiveTool-এর ওপর আস্থা থাকবে কি না৮ ÷ ৪০ = ২০%

Metric যখন লক্ষ্য হয়, তখন সে আর ভালো metric থাকে না (Goodhart-এর সূত্রের সাধারণ রূপ)। “Finding শূন্য” লক্ষ্য দিলে মানুষ scanner-এর rule বন্ধ করবেন। “MTTR কমান” বললে ticket বন্ধ করে নতুন খুলবেন। তাই metric দিয়ে দলকে শাস্তি নয়, পদ্ধতির সমস্যা খুঁজুন। আর নিছক “মোট finding-এর সংখ্যা” বলার চেয়ে এর পরিবর্তনের দিক দেখুন: নতুন tool চালালে সংখ্যা বাড়াটা ভালো খবরও হতে পারে।

৮ · Framework — SSDF, SDL, SAMM আর BSIMM

চারটি নাম প্রায়ই একসাথে শুনবেন। এগুলো প্রতিযোগী নয়, চারটি আলাদা প্রশ্নের উত্তর। রান্নার সাথে তুলনা করলে: একটি হলো “কোন কোন জিনিস থাকতেই হবে” তালিকা, একটি অভিজ্ঞ বাবুর্চির রেসিপি, একটি নিজের রান্নাঘরের মূল্যায়নপত্র, আর একটি বড় রেস্তোরাঁগুলো আসলে কী করে তার জরিপ।

নামএটি কীগঠনকখন কাজে লাগে
NIST SSDF, SP 800-218 v1.1 (ফেব্রুয়ারি ২০২২)কী অর্জন করতে হবে তার ফলভিত্তিক তালিকা, যে কোনো SDLC-তে বসানো যায়৪টি দল: PO (প্রতিষ্ঠান প্রস্তুত), PS (software রক্ষা), PW (ভালোভাবে সুরক্ষিত software বানানো), RV (দুর্বলতায় সাড়া)ক্লায়েন্ট বা সরবরাহকারীর সাথে সাধারণ ভাষা
Microsoft SDLMicrosoft-এর অভিজ্ঞতা থেকে আসা চর্চার তালিকাবর্তমান পাতায় ১০টি practice: মান ও metric, নিরাপদ feature, threat modeling, cryptography, supply chain, engineering environment, পরীক্ষা, platform, monitoring, trainingকী কী করতে হয় তার বাস্তব ছবি
OWASP SAMM v2 (২০২০)উন্মুক্ত maturity model, নিজের মূল্যায়ন ও রোডম্যাপের জন্য৫টি business function, প্রতিটিতে ৩টি practice, মোট ১৫টি“আমরা কোথায়, পরে কী” ঠিক করা
BSIMMআসল প্রতিষ্ঠানগুলো কী করছে তার বর্ণনামূলক জরিপ৪টি domain, ১২টি practice. বার্ষিক সংস্করণ, যেমন ২০২৬-এর BSIMM16-এ ১১১টি প্রতিষ্ঠানবড় প্রতিষ্ঠানের নিজেকে তুলনা

মূল পার্থক্যটি মনে রাখুন: SAMM বলে কী করা ভালো (prescriptive), BSIMM দেখায় অন্যরা কী করছেন (descriptive). অন্যরা করছেন বলেই সেটি আপনার জন্য ঠিক, তা নয়। আর এগুলোর কোনোটিই নিজে থেকে software নিরাপদ করে না। এটিও মনে রাখুন, NIST-এর এই নথি বাংলাদেশের কোনো আইন নয়। মার্কিন সরকারি ক্রয়ের প্রেক্ষিতে এর গুরুত্ব বেড়েছিল। আপনার ক্লায়েন্ট চাইলে তবেই এটি চুক্তির বিষয়।

নিচের কোডটি SAMM-এর ১৫টি practice-এর ওপর একটি কাল্পনিক ৫ জনের দলের স্ব-মূল্যায়ন। মানগুলো ধরে নেওয়া। আসল SAMM toolkit প্রতিটি practice-এর প্রশ্ন ধরে নম্বর দেয়, এখানে সহজ করে প্রতিটিকে ০ থেকে ৩ দেওয়া হয়েছে।

// SAMM-style self-assessment. Answers (0 to 3) are assumed for a toy 5-person team.
// Simplified: the real SAMM toolkit scores individual questions.
const answers = {
  Governance: { 'Strategy & Metrics': 0, 'Policy & Compliance': 1, 'Education & Guidance': 1 },
  Design: { 'Threat Assessment': 1, 'Security Requirements': 0, 'Secure Architecture': 1 },
  Implementation: { 'Secure Build': 2, 'Secure Deployment': 1, 'Defect Management': 1 },
  Verification: { 'Architecture Assessment': 0, 'Requirements-driven Testing': 1, 'Security Testing': 1 },
  Operations: { 'Incident Management': 1, 'Environment Management': 2, 'Operational Management': 1 },
};
const target = { 'Security Requirements': 1, 'Defect Management': 2, 'Incident Management': 2,
                 'Strategy & Metrics': 1, 'Threat Assessment': 2 };
const gaps = [];
let all = 0, count = 0;
for (const [fn, practices] of Object.entries(answers)) {
  const scores = Object.values(practices);
  const avg = scores.reduce((a, b) => a + b, 0) / scores.length;
  all += scores.reduce((a, b) => a + b, 0); count += scores.length;
  console.log(fn.padEnd(15) + avg.toFixed(2) + '  ' + '#'.repeat(Math.round(avg * 4)));
  for (const [name, score] of Object.entries(practices))
    if (target[name] !== undefined && target[name] > score)
      gaps.push({ name, score, want: target[name] });
}
console.log('overall        ' + (all / count).toFixed(2) + ' of 3');
console.log('next quarter (gap first, then lowest score):');
gaps.sort((a, b) => (b.want - b.score) - (a.want - a.score) || a.score - b.score);
gaps.forEach((g, i) => console.log(`  ${i + 1}. ${g.name}: ${g.score} -> ${g.want}`));

আউটপুট:

Governance     0.67  ###
Design         0.67  ###
Implementation 1.33  #####
Verification   0.67  ###
Operations     1.33  #####
overall        0.93 of 3
next quarter (gap first, then lowest score):
  1. Strategy & Metrics: 0 -> 1
  2. Security Requirements: 0 -> 1
  3. Threat Assessment: 1 -> 2
  4. Defect Management: 1 -> 2
  5. Incident Management: 1 -> 2

Governance-এর গড় (০ + ১ + ১) ÷ ৩ = ০.৬৭. মোট ১৪ ÷ ১৫ = ০.৯৩. এই ছোট দলের Secure Build ২ হলেও Security Requirements ০, অর্থাৎ যন্ত্র আছে, কিন্তু কী চাই তা লেখা নেই। লক্ষ্যের তালিকায় ৫টির সবকটির ফাঁক ১, তাই আগে এসেছে যেগুলোর বর্তমান মান ০. খেয়াল করুন, লক্ষ্য সব জায়গায় ৩ নয়। ছোট দলের ৩ দরকারও নেই। এই নম্বর নিজের মুখে বলা, তাই ০.৯৩ মানে “০.৯৩ নিরাপদ” নয়। এর একমাত্র কাজ পরের ত্রৈমাসিকে কোথায় সময় দেবেন, সেই আলোচনা শুরু করা।

আরও গভীরে: SSDF-এর প্রতিটি কাজের পাশে SAMM, BSIMM, ISO/IEC 27034 আর অন্য নথির রেফারেন্স থাকে, তাই এটিকে framework-গুলোর সেতুও বলা যায়। ২০২১ সালের মার্কিন Executive Order 14028 এর গুরুত্ব বাড়ায়। SBOM-এর জন্য ২০২১ সালের NTIA minimum elements-এর জায়গায় CISA ২০২৬ সালের জুলাইয়ে নতুন “Minimum Elements” প্রকাশ করেছে। আর NIST ডিসেম্বর ২০২৫-এ SSDF v1.2-এর খসড়া (SP 800-218 Rev. 1) প্রকাশ করেছে। নভেম্বর ২০২৬-এর শুরুতেও NIST-এর পাতায় এটি খসড়া, তাই চালু সংস্করণ v1.1. সর্বশেষ অবস্থা মূল সাইটে দেখে নিন। Disclosure আর দুর্বলতা সামলানোর আন্তর্জাতিক standard হলো ISO/IEC 29147 আর 30111.

৯ · ৫ জন ডেভেলপারের দলের ৯০ দিনের পরিকল্পনা

ধরুন ঢাকার একটি software দল। ৫ জন ডেভেলপার, কোনো আলাদা নিরাপত্তা কর্মী নেই। কাজ চলে কয়েকটি ক্লায়েন্টের web app আর একটি নিজস্ব পণ্য নিয়ে, hosting কখনো cPanel, কখনো VPS. ডলারের খরচ সীমিত। সপ্তাহে কাজ ৫ × ৪০ = ২০০ ঘণ্টা। ধরে নিই এর ৫% নিরাপত্তায় দেওয়া হবে: সপ্তাহে ১০ ঘণ্টা। এটি কোনো মান নয়, শুরু করার মতো একটি বাজেট। মূল কৌশল: আগে এমন জিনিস, যা একবার করলে স্থায়ী হয়।

সময়কাজশেষে যা দেখা যাবে
দিন ১–৩০
ভিত্তি
পালা করে একজন champion. সব code host, hosting আর email-এ MFA. PR ছাড়া main-এ merge বন্ধ। Secret scanning আর dependency alert চালু, lockfile রাখা। Service, ডেটা আর দায়িত্বের তালিকা। Backup restore করে দেখা।একটি পাতায় system-এর তালিকা, কোনো secret repository-তে নেই
দিন ৩১–৬০
অভ্যাস
Story template-এ চারটি abuse প্রশ্ন। ঝুঁকিপূর্ণ feature-এ ৩০ মিনিটের threat model. SAST advisory-তে, গোলমেলে rule ছাঁটাই। Secret-এ blocking gate. Login, অনুমতি আর file upload-এর জন্য একটি করে দলীয় library. প্রতি release-এ SBOM. security.txt.গত মাসের সব ঝুঁকিপূর্ণ story-তে criteria আছে
দিন ৬১–৯০
স্থায়িত্ব
নতুন high finding-এ blocking gate. Finding-এর বোর্ড, SLA আর মালিক। Exception register মেয়াদসহ। গুরুত্বপূর্ণ log আর alert. এক পাতার incident পরিকল্পনা আর একটি ছোট মহড়া। মাসে ৩০ মিনিটের পর্যালোচনা, SAMM-এর মতো নম্বর দিয়ে।Debt-এর প্রথম trend, প্রথম মহড়ার নোট

বাংলাদেশের প্রেক্ষিতে যা আলাদা করে ভাবতে হয়

  • Payment আর mobile wallet: Gateway-র callback server-এ যাচাই করুন, browser থেকে আসা “payment সফল” কথায় বিশ্বাস করবেন না। এটি প্রথম abuse case হওয়ার যোগ্য।
  • SMS OTP-র খরচ: OTP-র প্রতিটি অনুরোধে টাকা যায়। সীমা না থাকলে অপব্যবহার সরাসরি বিলে দেখা দেয় (পর্ব ৪৩)।
  • Client handover: Project দেওয়ার পরে patch কে করবেন, চুক্তিতে লিখুন। অনেক সাইট দেওয়ার পরে আর কেউ ছোঁন না, আর সেখানেই পুরোনো plugin জমে (পর্ব ৪৪)।
  • লোক বদল: ছোট দলে একজন গেলেই জ্ঞান যায়। Account, secret আর সিদ্ধান্ত লিখে রাখুন, আর কেউ ছাড়লে সেদিনই access বন্ধ করুন।
  • বিনামূল্যের পথ: Open source scanner আর code host-এর বিনা খরচের সুবিধা দিয়ে অনেকটা হয়। Tool-এর নাম বদলাতে পারে, নীতি নয়। Tool কেনার আগে দেখুন কে তার ফল পড়বেন।
  • ব্যক্তিগত ডেটা আর আইন: Requirement ধাপেই জিজ্ঞেস করুন কোন ব্যক্তিগত ডেটা সত্যি দরকার। দেশের উপাত্ত সুরক্ষা ও সাইবার আইনের সারকথা পর্ব ৬-এ আর পর্ব ৭০-এ। ব্যাংক বা আর্থিক খাতের ক্লায়েন্টের নিজস্ব নিয়ন্ত্রকের নির্দেশনা থাকতে পারে, সরাসরি মিলিয়ে নিন। এটি আইনি পরামর্শ নয়।
  • পরীক্ষার অনুমতি: ক্লায়েন্টের সিস্টেমে scan বা pentest শুধু লিখিত অনুমতিতে (পর্ব ৫০)। নিজের দলের staging পরিবেশ ব্যবহার করুন।
মূল ধারণা

ছোট দলের শত্রু সময়ের অভাব নয়, অগ্রাধিকারের অভাব। একসাথে ২০টি কাজ শুরু করলে একটিও টেকে না। প্রতি মাসে দুই-তিনটি কাজ স্থায়ীভাবে বসান। ৯০ দিন পরে এটি একটি অভ্যাস, ফাইলে পড়ে থাকা নীতি নয়।

পরীক্ষা ও ইন্টারভিউতে:

  • Shift left মানে কী? নিরাপত্তার কাজ পথের শুরুর দিকে আনা, কিন্তু release-পরের কাজ বাদ দেওয়া নয়।
  • Blocking আর advisory gate-এর পার্থক্য? একটি থামায়, অন্যটি জানায়। নতুন rule advisory-তে শুরু হয়।
  • Risk exception-এ কী থাকে? Finding, কারণ, compensating control, অনুমোদক, মেয়াদ।
  • BSIMM আর SAMM-এর পার্থক্য? BSIMM বর্ণনামূলক, SAMM নির্দেশমূলক।
  • Escape rate কী? মোট পাওয়া ত্রুটির কত ভাগ release-এর পরে ধরা পড়ল।

১০ · AI-এর যুগে Secure SDLC

AI এখন SDLC-র প্রায় সব ধাপে: requirement লেখা, কোড, পরীক্ষা, এমনকি review. একটি সহজ নীতি মনে রাখুন: AI-এর কোড একজন দ্রুত কিন্তু অপরিচিত ঠিকাদারের কোড। Gate একই, review একই, আর merge যিনি করলেন, দায়ও তাঁর। এই বিষয়ে একটি পরিচিত গবেষণা Perry ও সহলেখকদের (ACM CCS, ২০২৩): ৪৭ জন অংশগ্রহণকারীর পরীক্ষায় AI সহকারী পাওয়া দল বেশি অনিরাপদ কোড লিখলেন, আর নিজেদের কোডকে বেশি নিরাপদ ভাবলেন। নমুনা ছোট, আর সহকারীটি ছিল পুরোনো প্রজন্মের, তাই ফলটি আজকের সব tool-এ হুবহু খাটবে, এমন বলা যায় না। তবে আত্মবিশ্বাস বেড়ে যাওয়ার ঝুঁকিটি মনে রাখার মতো।

ধাপAI প্রায়ই যা করেযাচাই
Requirementসাধারণ checklist দেয়, আপনার ব্যবসার ঝুঁকি জানে নাচারটি abuse প্রশ্ন মানুষ করবেন, AI শুধু তালিকা বড় করবে
Designঅচল pattern বা বানানো standard উল্লেখ করেমূল নথি খুলে মিলিয়ে দেখা
ImplementationAuthorization বাদ, query জোড়া, MD5 বা ECB, verify=False, chmod 777, খোলা CORSDiff পড়া, abuse test, gate
Dependencyএমন package-এর নাম দেয় যা নেই, অথবা ভিন্ন জিনিসRegistry-তে আছে কি, কে রাখেন, lockfile-এ কী এলো
TriageCVE নম্বর বানায়, অতিরিক্ত নিশ্চয়তায় “false positive” বলেCVE মূল ডেটাবেসে খোঁজা, সিদ্ধান্ত মানুষের
চালানোPrompt-এ secret বা গ্রাহকের ডেটা চলে যেতে পারে, agent-এর অনুমতি বেশি থাকেSecret ও ব্যক্তিগত ডেটা নয়, least privilege (পর্ব ৫১)

AI সবচেয়ে কাজে আসে রক্ষকের সহকারী হিসেবে, abuse case-এর খসড়া আর review-এর দ্বিতীয় চোখ হিসেবে। Prompt-এ বাস্তব ডেটা বা secret দেবেন না। উত্তরকে শুরুর খসড়া ভাবুন, সিদ্ধান্ত নয়।

আমি নিজের দলের একটি feature-এর নিরাপত্তা নকশা করছি। Feature: গ্রাহক তাঁর order-এর refund চাইবেন, support কর্মী অনুমোদন করবেন। Stack: [এখানে framework লিখুন]। কোনো আসল ডেটা বা secret দিচ্ছি না। ১. এই feature-এর ৫টি abuse case লেখো, প্রতিটি রক্ষকের দৃষ্টিতে, কোনো আক্রমণের ধাপ ছাড়া। ২. প্রতিটির জন্য একটি পরীক্ষাযোগ্য acceptance criterion দাও। ৩. কোন ক্ষেত্রে তুমি নিশ্চিত নও, স্পষ্ট করে বলো। কোনো CVE নম্বর বা standard উল্লেখ করলে তার উৎস দাও, না জানলে লিখো "জানি না"। ৪. কোনো নিরাপত্তা-পরীক্ষা বন্ধ করার পরামর্শ দিও না।

AI ব্যবহারের চেকলিস্ট

নিজে AI মডেল বানালে NIST-এর SP 800-218A (জুলাই ২০২৪) দেখুন, যা generative AI-এর জন্য SSDF-এর একটি প্রোফাইল। শুধু ব্যবহারকারী হলে ওপরের চেকলিস্টই আপাতত যথেষ্ট।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১“Production-এ বাগ সারাতে ১০০ গুণ খরচ” — এই কথা এত ছড়াল কেন, আর আপনার ম্যানেজারকে এখন কী বলবেন?

সংখ্যাটির গল্প একটু গোয়েন্দা কাহিনির মতো। Barry Boehm-এর ১৯৮১ সালের Software Engineering Economics বইয়ে দেরিতে খরচ বাড়ার তথ্য ছিল, সেই সময়ের বড় প্রকল্প থেকে নেওয়া। তখন কোড লেখা হতো ভিন্ন পরিবেশে, আর release মানে ছিল ভারী, ধীর একটি কাজ। পরে Boehm ও Basili ২০০১ সালে “প্রায়ই ১০০ গুণ” লেখেন, আর আলাদা করে বলেন গুণকটি সিস্টেমের আকারে নির্ভর করে।

অন্যদিকে সেই বিখ্যাত ধাপ-ধাপ চার্টটি “IBM Systems Sciences Institute”-এর নামে ঘোরে। Laurent Bossavit-এর অনুসন্ধানের খবর অনুযায়ী উৎসটি ঠেকে একটি বইয়ের উদ্ধৃতি আর কোর্সের নোটে, যার পেছনের ডেটা পাওয়া যায় না। সংখ্যাটি ছড়িয়েছে কারণ এটি সুন্দর, সহজ, আর নিরাপত্তা বিক্রির জন্য খুব কাজের। Slide থেকে slide-এ যেতে যেতে কেউ মূলটি খোলেননি।

Menzies ও সহলেখকদের ২০১৭ সালের গবেষণা ১৭১টি প্রকল্পে এই প্রভাব খুঁজে পায়নি। তবে সেগুলো সবই একটি নির্দিষ্ট process-এ চলা প্রকল্প, তাই এটি “দেরিতে কখনো খরচ বাড়ে না” প্রমাণ করে না। লেখকেরাও এটিই বলেন: প্রভাবটি সবসময় আছে, তা ধরে নেওয়া যায় না।

ম্যানেজারকে তাই সংখ্যা না, যুক্তি বলুন। নকশার ভুল সারাতে পুরো feature বদলাতে হয়। আর নিরাপত্তায় একটি বাড়তি খরচ আছে যা সাধারণ বাগে নেই: ক্ষতি ঘটে গেলে তা ফেরানো যায় না। ফাঁস হওয়া ডেটা, গ্রাহকের আস্থা, আইনি দায়, এগুলো fix-এর ঘণ্টায় মাপা যায় না। তারপর নিজের দলের দুটি বাস্তব উদাহরণের ঘণ্টা দেখান।

মূল উপলব্ধি: ভালো যুক্তিকে দুর্বল সংখ্যা দিয়ে সাজালে একদিন যুক্তিটিও অবিশ্বাসযোগ্য হয়। নিজের দাবির উৎস নিজে খুলে দেখা নিরাপত্তা পেশার মৌলিক অভ্যাস।

প্র ০২Microsoft-এর মতো বিশাল কোম্পানি ২০০২ সালে নিরাপত্তার জন্য পথ বদলাল কেন? একটি ছোট দল এখান থেকে কী নিতে পারে?

২০০১ থেকে ২০০৩ সালের মধ্যে Code Red, Nimda, SQL Slammer আর Blaster-এর মতো worm Microsoft-এর software-এর ত্রুটি কাজে লাগিয়ে দ্রুত ছড়ায়। বিষয়টি আর শুধু প্রযুক্তিগত ছিল না। গ্রাহকের আস্থা, সরকারি ক্রয়, কোম্পানির সুনাম সব জড়িয়ে গিয়েছিল।

২০০২ সালের জানুয়ারিতে Bill Gates কর্মীদের “Trustworthy Computing” নামে একটি memo পাঠান, যেখানে নতুন feature-এর চেয়ে নিরাপত্তাকে অগ্রাধিকার দেওয়ার কথা বলা হয়। Windows দলের বড় অংশ সেই সময় নিয়মিত feature-এর কাজ থামিয়ে নিরাপত্তায় মন দেয়। কিন্তু শিক্ষা ছিল এই যে একবারের ধাক্কায় টেকে না। তাই নিয়মিত পদ্ধতি লাগল, আর ২০০৪ সালের দিকে Security Development Lifecycle কোম্পানির ভেতরে বাধ্যতামূলক নীতি হয়। পরে Michael Howard ও Steve Lipner এটি নিয়ে বই লেখেন, আর Microsoft নিজের পদ্ধতি প্রকাশ করে।

লক্ষ করুন, তিনটি জিনিস একসাথে কাজ করেছে। উচ্চ নেতৃত্ব প্রকাশ্যে অগ্রাধিকার বদলেছেন। একটি নিয়মিত পদ্ধতি বানানো হয়েছে। আর release আটকানোর ক্ষমতা নিরাপত্তার সিদ্ধান্তের হাতে এসেছে। শুধু tool কেনা হয়নি।

ছোট দল Microsoft-এর পদ্ধতি কপি করতে পারবে না, আর করার দরকারও নেই। কিন্তু নীতিগুলো নেওয়া যায়। মালিক বা CTO মুখে বলবেন, নিরাপত্তার জন্য একটি feature পেছানো অপরাধ নয়। একটি ছোট নিয়মিত পদ্ধতি থাকবে। আর “এই ত্রুটি নিয়ে release হবে না” তালিকা আগে থেকে ঠিক থাকবে।

মূল উপলব্ধি: Secure SDLC প্রথমে সংস্কৃতি ও অগ্রাধিকারের সিদ্ধান্ত, পরে tool-এর সিদ্ধান্ত। আগেরটি ছাড়া পরেরটি কাজ করে না।

প্র ০৩Equifax-এর ২০১৭ সালের ঘটনায় patch তো প্রকাশিত ছিল। তাহলে দোষ কোন ধাপের — কোডের, না operate-এর?

মার্কিন GAO আর কংগ্রেসের প্রকাশিত প্রতিবেদন অনুযায়ী ঘটনাটি অনেক ছোট ব্যর্থতার যোগফল। Apache Struts-এ একটি গুরুতর ত্রুটি ২০১৭ সালের মার্চে প্রকাশ পায়, আর patch-ও আসে। কোম্পানির ভেতরে জানানোও হয়েছিল। কিন্তু যে দলের জানা দরকার ছিল, তারা ঝুঁকিতে থাকা সিস্টেমটি চিহ্নিত করেনি, আর পরের scan-ও সেটি ধরতে পারেনি। এরপর মাসের পর মাস তথ্য বাইরে যায়, যা ধরা পড়তে দেরি হয়, কারণ traffic দেখার একটি যন্ত্রের certificate মেয়াদোত্তীর্ণ ছিল। প্রায় ১৪.৭ কোটি মানুষের তথ্য প্রভাবিত হয় বলে প্রকাশিত হয়।

এবার এটিকে আমাদের ছয় ধাপে বসান। ত্রুটিটি নিজে তৃতীয় পক্ষের কোডে। Implementation দলের হাতে ছিল শুধু এর ব্যবহার। কিন্তু কোন application-এ কোন component আছে, তার সঠিক তালিকা থাকলে প্রথম প্রশ্নের উত্তর সহজ হতো। এখানেই SBOM আর সম্পদের তালিকার গুরুত্ব। Operate ধাপে তিনটি কাজ ব্যর্থ: patch-এর মালিকানা, scan-এর সম্পূর্ণতা, আর নজরদারির যন্ত্রের রক্ষণাবেক্ষণ।

একটি তির্যক শিক্ষা হলো certificate. নিরাপত্তার যন্ত্রও একটি সিস্টেম, যার রক্ষণাবেক্ষণ লাগে। মেয়াদ শেষ হওয়া ছাড়ের মতো মেয়াদ শেষ হওয়া certificate-ও নীরবে সুরক্ষা বন্ধ করে দিতে পারে।

একটি বিষয় মনে রাখুন: কোনো একজন মানুষকে দোষ দিলে শেখা বন্ধ হয়। একটি পদ্ধতি একজনের ভুলে ভেঙে পড়লে সেটি পদ্ধতিরই দুর্বলতা। ছোট দলের প্রশ্নটি তাই: “আজ যদি একটি library-তে গুরুতর ত্রুটি প্রকাশ পায়, আমরা কত ঘণ্টায় জানব আমাদের কোথায় সেটি আছে, আর কে সারাবেন?”

মূল উপলব্ধি: Secure SDLC শুধু release পর্যন্ত নয়। অনেক বড় ব্যর্থতা আসে “জানতাম, কিন্তু কার কাজ ছিল জানতাম না” থেকে।

প্র ০৪Log4Shell-এর পর সবাই SBOM চাইলেন। SBOM কি সমাধান? xz-এর ঘটনা এখানে কী শেখায়?

২০২১ সালের ডিসেম্বরে Log4j library-তে Log4Shell (CVE-2021-44228) প্রকাশ পায়। সবচেয়ে কঠিন প্রশ্নটি ছিল খুব সাধারণ: “আমাদের কোথায় এটি আছে?” Log4j প্রায়ই সরাসরি ব্যবহার হতো না, অন্য library-র ভেতর দিয়ে আসত। অনেক প্রতিষ্ঠান দিনের পর দিন শুধু খোঁজার কাজেই কাটায়। এখানে SBOM-এর যুক্তি শক্তিশালী: খাবারের প্যাকেটের উপাদান তালিকার মতো, প্রতিটি build-এ কী আছে তা লেখা থাকলে সার্চ করলেই উত্তর মেলে।

কিন্তু SBOM-এর সীমা আছে। এটি বলে কী আছে, এটি বলে না সেই কোড চলার পথে পৌঁছানো যায় কি না। তাই VEX-এর মতো পরিপূরক ধারণা এসেছে, যেখানে সরবরাহকারী জানান তাঁর পণ্য আসলে প্রভাবিত কি না। আবার SBOM বানিয়ে ফেলে রাখলে কাজ হয় না। সেটি build-এর সাথে স্বয়ংক্রিয় হতে হবে, আর কেউ সেটির বিরুদ্ধে সতর্কবার্তা মেলাবেন। না হলে এটি আরেকটি মোটা ফাইল।

২০২৪ সালের xz ঘটনা আরেকটি দিক দেখায়। সেখানে সমস্যা জানা ত্রুটি ছিল না, ছিল বিশ্বস্ত হয়ে ওঠা একটি অবদানকারীর পথে লুকানো backdoor, যা একজন প্রকৌশলীর সন্দেহে ধরা পড়ে বলে প্রকাশিত হয়েছে। SBOM আপনাকে বলত xz আছে, কিন্তু ঘটনা জানার আগে কিছু সতর্ক করত না। ঘটনা জানার পরে অবশ্য কোথায় আছে তা দ্রুত খুঁজতে কাজে দিত। তাই build-এর সততা আর উৎসের যাচাই আলাদা কাজ, যা পর্ব ৪৮-এ আসবে।

৫ জনের দলের জন্য বাস্তব পরামর্শ: release-এর সাথে স্বয়ংক্রিয় SBOM রাখুন, কারণ খরচ কম। কিন্তু নিজের প্রথম লক্ষ্য রাখুন “এক ঘণ্টায় বলতে পারি কোথায় কী আছে”।

মূল উপলব্ধি: SBOM দৃশ্যমানতা দেয়, সুরক্ষা নয়। দৃশ্যমানতা ছাড়া সুরক্ষা অসম্ভব, কিন্তু দৃশ্যমানতা একা যথেষ্ট নয়।

প্র ০৫AI দিয়ে কোড তিন গুণ দ্রুত লেখা গেলে review আর gate কি আগের মতোই চলবে?

না, আর এখানেই আসল পরিবর্তন। আগে দলের বাধা ছিল কোড লেখা। AI সেটি সরিয়ে দিলে বাধা চলে যায় review-তে। ধরুন একজন আগে সপ্তাহে ৫টি PR দিতেন, এখন ১৫টি। Reviewer-এর ঘণ্টা বাড়েনি। তখন যা ঘটার কথা তাই ঘটে: review হালকা হয়, “দেখতে ঠিকই লাগছে” বলে merge হয়।

Perry ও সহলেখকদের ২০২৩ সালের গবেষণা (৪৭ জন, পুরোনো প্রজন্মের সহকারী) ঠিক এই ঝুঁকিটির দিকে ইঙ্গিত করে। পাঁচটির মধ্যে চারটি কাজে AI পাওয়া দল বেশি অনিরাপদ সমাধান দেয়, আর নিজের কাজ নিয়ে বেশি আত্মবিশ্বাসী থাকে। গবেষণাটি ছোট, আজকের tool অনেক বদলেছে। কিন্তু মানুষের দিকটি বদলায়নি: সুন্দর করে লেখা কোড দেখলে আমরা কম সন্দেহ করি।

তাই তিনটি জিনিস বদলাতে হয়। প্রথম, review-কে ঝুঁকিভিত্তিক করুন। UI-এর লেখা এক রকম, auth/ আর payment/ অন্য রকম। দ্বিতীয়, মানুষের চোখের ওপর ভার কমাতে স্বয়ংক্রিয় gate আর abuse test বেশি জরুরি হয়, কারণ তারা ক্লান্ত হয় না। অংশ ৩-এর acceptance criteria-ই এখানে আপনার সবচেয়ে বড় সম্পদ: AI যে কোডই লিখুক, “user A, user B-র order দেখতে পারবেন না” পরীক্ষাটি চলবে। তৃতীয়, PR ছোট রাখুন। ৮০০ লাইনের AI-লেখা PR কেউ সত্যি পড়েন না।

সাবধানে ভাবার মতো আরেকটি বিষয়: AI agent যদি নিজেই PR খোলে, CI চালায়, secret-এ পৌঁছায়, তাহলে সে SDLC-র ভেতরে একজন নতুন “কর্মী”। তাকে least privilege দিন, আর merge-এর ক্ষমতা মানুষের হাতে রাখুন। NIST-এর উপস্থাপনাতেও SSDF-এর নতুন খসড়ায় AI-চালিত tool-এর কথা এসেছে, এটি বলে দেয় বিষয়টি এখন মূলধারায়।

মূল উপলব্ধি: কোড লেখা সস্তা হলে যাচাই-ই হয় দলের আসল দক্ষতা। পরীক্ষাযোগ্য শর্ত লিখতে পারা AI-এর যুগে আরও মূল্যবান।

অনুশীলন

সব তথ্য প্রশ্নের ভেতরেই আছে। সংখ্যাগুলো ধরে নেওয়া।

  1. সংখ্যার হিসাব: এক ত্রৈমাসিকে ৩৪টি ত্রুটি release-এর আগে আর ৬টি পরে ধরা পড়েছে। ৪০টি finding বন্ধ হয়েছে, এর ৩১টি SLA-র মধ্যে। Overdue আছে ১টি critical, ৪টি high, ৬টি medium, পয়েন্ট ১০, ৩ আর ১. আরেকটি finding-এ release পেছালে ক্ষতি ৳২,০০,০০০, ঘটনায় ক্ষতি ৳৪০,০০,০০০. বের করুন: (ক) escape rate (খ) SLA মানার হার (গ) debt পয়েন্ট (ঘ) সমান হওয়ার সম্ভাবনা। মাসিক সম্ভাবনা ২% হলে প্রত্যাশিত ক্ষতি কত?

    (ক) ৬ ÷ (৩৪ + ৬) = ৬ ÷ ৪০ = ১৫%. (খ) ৩১ ÷ ৪০ = ৭৭.৫%. (গ) ১ × ১০ + ৪ × ৩ + ৬ × ১ = ১০ + ১২ + ৬ = ২৮ পয়েন্ট।

    (ঘ) ২,০০,০০০ ÷ ৪০,০০,০০০ = ৫%. ২% হলে ০.০২ × ৪০,০০,০০০ = ৳৮০,০০০, যা ৳২,০০,০০০-এর কম। তাই শুধু টাকার হিসাবে release যৌক্তিক। তবে অনুমান ৫%-এর ওপরে গেলে উত্তর বদলায়, আর ব্যক্তিগত ডেটা জড়িত থাকলে এই হিসাবই শেষ কথা নয়।

  2. নকশা সমালোচনা: একটি কোম্পানির নীতি: “সব SAST finding-এ build থামবে। প্রতিটি PR নিরাপত্তা দলের একজন দেখবেন। জরুরি হলে ম্যানেজার মুখে বলে ছাড় দেবেন।” ৩০ জন ডেভেলপার, নিরাপত্তা দলে ১ জন। তিনটি সমস্যা ধরুন আর বদলি প্রস্তাব দিন।

    ১. সব finding-এ block: False positive আর পুরোনো ঋণে সবাই আটকাবেন, ফলে rule বন্ধ করার চাপ আসবে। বদলে শুধু নতুন, গুরুতর, পৌঁছানো যায় এমন জিনিসে block, বাকিটা advisory, আর নতুন rule আগে advisory-তে।

    ২. একজনের ওপর সব PR: ৩০ জনের PR এক জনের সামনে জমবে, তিনিই bottleneck, আর ছুটিতে গেলে কাজ থামবে। বদলে সহকর্মী review, champion, আর ঝুঁকিপূর্ণ path-এ বাধ্যতামূলক reviewer. Secure default দিয়ে review-এর প্রয়োজনই কমান।

    ৩. মুখের ছাড়: কোনো রেকর্ড, মালিক, মেয়াদ নেই। ছয় মাস পরে কেউ জানবেন না কেন এটি চলছে। বদলে লিখিত exception, risk owner, compensating control আর স্বয়ংক্রিয় মেয়াদ।

  3. আউটপুট অনুমান: অংশ ৫-এর decide ফাংশনে exceptions-এ আছে { id: 'EX-9', finding: 'F7', expires: '2026-11-10', owner: 'CTO' }. Build 105-এর তারিখ 2026-11-11, আর finding তিনটি: F6 (sca, critical, নতুন, পৌঁছানো যায় না), F7 (sast, high, নতুন, পৌঁছানো যায়), F8 (secret, medium, পুরোনো, পৌঁছানো যায় না)। আউটপুট কী হবে, আগে অনুমান করুন।
    build 105 (2026-11-11): FAILED
      F6 ADVISE not reachable: review later
      F7 BLOCK  EX-9 expired on 2026-11-10
      F8 BLOCK  secret: no exception allowed

    F6 গুরুতর ও নতুন, কিন্তু reachable-এর পরীক্ষায় ADVISE হলো। F7-এর ছাড়ের মেয়াদ ঠিক এক দিন আগে শেষ, তাই BLOCK. F8 medium আর পুরোনো হলেও secret-এর পরীক্ষা সবার আগে, তাই BLOCK. একটি BLOCK থাকলেই পুরো build FAILED. শর্তের ক্রম এখানে নীতির অংশ: secret-এর লাইন নিচে নামালে F8 পার পেয়ে যেত।

  4. Abuse case লেখা: একটি কাল্পনিক মোবাইল wallet-এ নতুন feature: “বন্ধুকে টাকা পাঠান, PIN দিয়ে নিশ্চিত করুন, দিনে সর্বোচ্চ ৳২৫,০০০.” তিনটি abuse case আর প্রতিটির একটি পরীক্ষাযোগ্য acceptance criterion লিখুন। আক্রমণের ধাপ নয়, শুধু ক্ষতির পরিস্থিতি আর প্রত্যাশিত আচরণ।

    একটি নমুনা, আপনার উত্তর ভিন্ন হতে পারে:

    • একই অনুরোধ দুবার: Network সমস্যায় অ্যাপ আবার পাঠালে টাকা দুবার যেতে পারে। শর্ত: একই transaction key-তে দ্বিতীয় অনুরোধ balance বদলাবে না, আগের ফলই দেবে।
    • সীমা এড়ানো: একসাথে অনেক অনুরোধে দিনের সীমা পার হতে পারে। শর্ত: একই সময়ে পাঠানো অনুরোধেও দিনের মোট ৳২৫,০০০-এর বেশি হবে না, হিসাব server-এ এক transaction-এ।
    • PIN অনুমান: শর্ত: ৩ বার ভুল PIN-এর পর লেনদেন সাময়িক বন্ধ, গ্রাহককে বার্তা, আর ঘটনাটি log-এ। PIN কোনো log-এ থাকবে না।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি feature-এর নিরাপত্তার কাজগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. Abuse case আর acceptance criteria লেখা
  2. Threat model করে নিরাপদ নকশা বাছাই
  3. Secure coding আর code review
  4. নিরাপত্তা পরীক্ষা আর gate
  5. Sign-off, SBOM আর ফেরার পথ প্রস্তুত
  6. Monitoring, patch আর disclosure

“Production-এ বাগ সারাতে requirement-এর চেয়ে ১০০ গুণ খরচ” — এই দাবি সম্পর্কে কোন কথাটি সবচেয়ে সঠিক?

  • এটি IBM-এর গবেষণায় প্রমাণিত একটি সর্বজনীন নিয়ম
  • এটি পুরোপুরি মিথ্যা, দেরিতে কখনো খরচ বাড়ে না
  • প্রবণতাটি প্রায়ই সত্য, কিন্তু ১০০ গুণ কোনো সর্বজনীন সংখ্যা নয় আর জনপ্রিয় চার্টটির উৎস দুর্বল
  • এটি শুধু নিরাপত্তা-বহির্ভূত বাগের জন্য খাটে, নিরাপত্তায় নয়

নিচের কোনটি একটি পরীক্ষাযোগ্য security acceptance criterion?

  • Order পাতাটি সম্পূর্ণ নিরাপদ হবে
  • User A, user B-র order চাইলে server 403 দেবে আর response-এ B-র কোনো তথ্য থাকবে না
  • কোড সেরা নিরাপত্তা চর্চা মেনে লেখা হবে
  • Release-এর আগে একটি scanner চালানো হবে

একটি দলের নীতি: “শুধু নতুন, পৌঁছানো যায় এমন high বা critical finding-এ build থামবে; secret সবসময় থামবে।” একটি PR-এ এসেছে: (১) পুরোনো critical finding, পৌঁছানো যায় (২) নতুন medium finding. ফল কী?

  • Critical আছে, তাই build থামবে
  • নতুন finding আছে, তাই build থামবে
  • Build পাস করবে, আর দুটি finding নিয়ে আর কিছু করার নেই
  • Build পাস করবে, তবে দুটিই পরামর্শ বা ঋণ হিসেবে নজরে থাকবে

একটি security exception-এর সবচেয়ে জরুরি বৈশিষ্ট্য কোনটি?

  • লিখিত কারণ, ঝুঁকির মালিক আর একটি মেয়াদ থাকা
  • যে ডেভেলপার কোড লিখেছেন, তিনি নিজে অনুমোদন করবেন
  • ছাড়টি স্থায়ী হবে, যাতে বারবার আবেদন না লাগে
  • জরুরি হলে মুখে বলে দেওয়াই যথেষ্ট

“আমাদের মতো প্রতিষ্ঠানগুলো আসলে কী করছে” — এই প্রশ্নের উত্তরের জন্য তৈরি বর্ণনামূলক জরিপ কোনটি?

  • NIST SSDF (SP 800-218)
  • OWASP SAMM
  • BSIMM
  • Microsoft SDL

একটি দলের high finding-এর median সমাধান-সময় ২৮ দিন, SLA ৩০ দিন। তবু খোলা finding ছয় মাসে ৬ থেকে ২৭ হয়েছে, আর সবচেয়ে পুরোনোটির বয়স ১৭৮ দিন। সবচেয়ে সঠিক ব্যাখ্যা কোনটি?

  • Median SLA-র মধ্যে, তাই কোনো সমস্যা নেই
  • Median শুধু বন্ধ finding গোনে, তাই পুরোনো খোলা finding আর আগমনের হার তাতে ধরা পড়ে না
  • Scanner বন্ধ করলেই সমস্যাটি মিটে যাবে
  • SLA বাড়িয়ে ৯০ দিন করলেই ঋণ শেষ হবে

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Secure SDLC মানে প্রতিটি ধাপে একটি কাজ আর একটি প্রমাণ, আলাদা প্রক্রিয়া নয়।
  2. দেরির খরচ প্রায়ই বেশি, কিন্তু “১০০ গুণ” কোনো সর্বজনীন সত্য নয়। উৎস দেখে কথা বলুন।
  3. নিরাপদ পথকে সবচেয়ে সহজ পথ বানান: secure default, paved road, সময় বরাদ্দ করা champion.
  4. Gate নতুন, গুরুতর, পৌঁছানো যায় এমন জিনিসে থামায়। ছাড়ের মালিক ও মেয়াদ থাকে। ঝুঁকি গ্রহণের সিদ্ধান্ত ব্যবসার মালিকের।
  5. ঋণের trend আর বয়স দেখুন, শুধু গড় নয়। ছোট দল ৯০ দিনে ধাপে ধাপে এগোয়, আর AI-এর কোডও একই পথে যায়।

পরের পর্বে: পথের নকশা জানলেন। এবার সেই পথের ডেভেলপারের টেবিলে: input, output, error আর secret সামলানোর নিয়ম। পর্ব ৪৬ · Secure coding.

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান