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

Threat modeling — STRIDE, attack surface আর কোন ঝুঁকি আগে

Threat Modeling — STRIDE, Attack Surface & Risk Prioritisation

Taught in Bangla, this lesson teaches threat modeling through Shostack's four questions: drawing a DFD with trust boundaries, applying STRIDE to each element, measuring and reducing attack surface, reading attack trees from a defender's view, ranking risks with likelihood and impact while knowing DREAD's limits, and turning threats into tests and backlog items, with a full worked example on a fictional shop's checkout.

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

  • Shostack-এর চারটি প্রশ্ন ধরে যেকোনো সিস্টেমের threat model শুরু করা
  • DFD আঁকা, trust boundary খুঁজে পাওয়া আর STRIDE দিয়ে প্রতিটি উপাদান যাচাই করা
  • Attack surface মাপা, কমানো আর রক্ষকের চোখে attack tree পড়া
  • DREAD-এর সীমা বোঝা, likelihood × impact দিয়ে ঝুঁকি সাজানো আর তার দুর্বলতা জানা
  • একটি threat থেকে test case আর backlog item বানিয়ে দলের কাজে যুক্ত করা

১ · তালা কেনার আগে ঘরটা দেখুন — threat modeling কী

ধরুন আপনি মিরপুরে নতুন একটি বাসা ভাড়া নিলেন। প্রথম দিনেই বাজারের সবচেয়ে দামি তালা কিনে সদর দরজায় লাগালেন। কিন্তু রান্নাঘরের জানালায় গ্রিল নেই, ছাদের দরজা খোলা, আর চাবির একটি কপি আগের ভাড়াটিয়ার কাছে রয়ে গেছে। তালাটি ভালো, কিন্তু টাকা খরচ হয়েছে ভুল জায়গায়।

বুদ্ধিমান মানুষ আগে ঘরটি ঘুরে দেখেন। কী কী রক্ষা করার আছে? কোন কোন পথে ঢোকা যায়? কোন ঝুঁকিটি সবচেয়ে বাস্তব? তারপর ঠিক করেন, আগে গ্রিল, পরে তালা। সফটওয়্যারের জন্য এই কাজটির নাম threat modeling.

মূল ধারণা

Threat modeling হলো একটি সিস্টেমের ছবি এঁকে, কাঠামো মেনে খুঁজে দেখা কী ভুল হতে পারে, আর ঠিক করা কোনটির জন্য কী করা হবে। এটি কোনো tool নয়, কোনো scan-ও নয়। এটি একদল মানুষের গোছানো আলোচনা, যার ফল হলো সিদ্ধান্ত আর কাজের তালিকা।

পর্ব ২-এ আপনি threat, vulnerability আর risk-এর ভাষা শিখেছেন, আর পর্ব ৩-এ মূলনীতিগুলো। এই পর্বে সেই ভাষা কাজে লাগবে একটি প্রশ্নের উত্তরে: এই নির্দিষ্ট সিস্টেমে কোন নীতিটি কোথায় লাগবে?

এখানে একটি শব্দের ব্যাপারে সতর্ক থাকুন। কেউ কেউ “threat” বলতে সম্ভাব্য ঘটনা বোঝান, যেমন “জাল পেমেন্ট বার্তা গ্রহণ”। আবার threat intelligence-এর দলে শব্দটি প্রায়ই মানুষ বা দলকে বোঝায়, যাকে বলে threat actor. এই পর্বে threat মানে সম্ভাব্য ক্ষতিকর ঘটনা।

চারটি প্রশ্ন

Threat modeling শুনতে ভারী লাগে, কিন্তু Adam Shostack পুরো কাজটিকে চারটি সাধারণ প্রশ্নে এনেছেন। তাঁর ২০১৪ সালের বই Threat Modeling: Designing for Security-এর মাধ্যমে কাঠামোটি ছড়িয়ে পড়ে। প্রশ্নের ভাষা সময়ের সাথে একটু বদলেছে, আজকের রূপটি নিচে:

প্রশ্নবাড়ির উদাহরণেসফটওয়্যারের ফল
১. What are we working on? আমরা কী নিয়ে কাজ করছি?ঘরের নকশা আঁকাDFD, trust boundary, অনুমানের তালিকা
২. What can go wrong? কী ভুল হতে পারে?কোন পথে কী বিপদThreat-এর তালিকা (STRIDE, attack tree)
৩. What are we going to do about it? তা নিয়ে কী করব?গ্রিল, তালা, পাহারাসিদ্ধান্ত, mitigation, backlog item
৪. Did we do a good job? কাজটি কি ভালো হলো?রাতে নিজে ঘুরে পরখ করাTest, review, মডেল হালনাগাদ

Shostack নিজে লিখেছেন, “what are we building” না বলে “working on” বলা ইচ্ছাকৃত: “building” শব্দটি মানুষকে একবারে-সব-নকশা ধারার দিকে টানে, অথচ চলমান সিস্টেমেও এই প্রশ্ন খাটে। আর “you” বদলে “we” করা হয়েছে, কারণ কাজটি দলের। Threat Modeling Manifesto-ও এই চার প্রশ্ন গ্রহণ করেছে, যদিও সেখানে শেষ প্রশ্নটির রূপ “Did we do a good enough job?”

১৯৯৯ সালের এপ্রিলে Microsoft-এর ভেতরের একটি journal-এ Loren Kohnfelder আর Praerit Garg লেখেন “The Threats to Our Products” নামের লেখাটি। সেখানেই আসে STRIDE. Threat খোঁজাকে কাঠামো দেওয়ার প্রথম দিকের প্রচেষ্টা হিসেবে একে ধরা হয়। ২০২০ সালে একদল অনুশীলনকারী একসাথে Threat Modeling Manifesto প্রকাশ করেন, যেখানে মূল বার্তা: tool-এর চেয়ে মানুষ, একবারের দলিলের চেয়ে ক্রমাগত উন্নতি।

এই পর্বের সব উদাহরণ নিজের সিস্টেম রক্ষার জন্য কাগজে-কলমে ভাবনা। এখানে কোনো সিস্টেমে হাত দিতে হয় না। মডেল থেকে বের হওয়া ধারণা চলমান সিস্টেমে পরীক্ষা করতে চাইলে সেটি নিজের সিস্টেম হতে হবে, অথবা লিখিত অনুমতি লাগবে। অনুমতি ছাড়া অন্যের সিস্টেমে প্রবেশ অপরাধ; বিস্তারিত পর্ব ৬ · আইন আর নৈতিকতা-য়।

২ · প্রশ্ন ১: সিস্টেমের ছবি — DFD আর trust boundary

না দেখে পাহারা দেওয়া যায় না। তাই প্রথম কাজ ছবি আঁকা। সবচেয়ে প্রচলিত ছবি data flow diagram, সংক্ষেপে DFD. এতে ক্লাস, ফাংশন বা server-এর নাম মুখ্য নয়। মুখ্য হলো ডেটা কোথা থেকে কোথায় যায়। পোস্ট অফিসে একটি চিঠির পথ যেভাবে আঁকবেন, ঠিক তেমন। DFD-র উপাদান মাত্র চারটি, সাথে একটি বিশেষ দাগ:

উপাদানপ্রচলিত আকৃতিঅর্থউদাহরণ
External entityআয়তক্ষেত্রআপনার নিয়ন্ত্রণের বাইরের পক্ষগ্রাহক, পেমেন্ট গেটওয়ে
Processবৃত্তযে কোড ডেটা নিয়ে কাজ করেCheckout API
Data storeদুটি সমান্তরাল রেখাযেখানে ডেটা জমা থাকেDatabase, log, cache
Data flowতীরডেটার চলাচলঅর্ডারের তথ্য, “paid” বার্তা
Trust boundaryকাটা কাটা রেখাযেখানে বিশ্বাসের মাত্রা বদলায়Internet আর আপনার সার্ভারের মাঝে

ব্যাংকের শাখায় ঢুকলে দেখবেন, বাইরের হলঘরে যে কেউ যেতে পারেন। কাউন্টারের ভেতরে শুধু কর্মী। আর লকার রুমে ঢুকতে আলাদা রেজিস্টার, পরিচয়পত্র আর দুটি চাবি লাগে। প্রতিটি সীমানায় যাচাই বদলায়। এই সীমানাগুলোই trust boundary. কাগজের একটি টাকা-জমার স্লিপ হলঘর থেকে কাউন্টার পেরোলেই ক্যাশিয়ার মিলিয়ে দেখেন। সফটওয়্যারেও সীমানা পেরোনো ডেটা যাচাই ছাড়া মানা যায় না।

এবার একটি কাল্পনিক অনলাইন বাজারের checkout নিন। গ্রাহক কার্ট থেকে অর্ডার দেন, বাইরের একটি পেমেন্ট গেটওয়ে টাকা নেয়, আর support কর্মীরা refund করেন। পুরো পর্বে আমরা এই সিস্টেমই ব্যবহার করব। নিচের ছবিটি ধাপে ধাপে তৈরি হবে। “পরে” চাপুন।

কাল্পনিক অনলাইন বাজারের checkout-এর DFD App zone Data zone পেমেন্ট গেটওয়ে গ্রাহক Support কর্মী CheckoutAPI Orderservice Orders DB Audit log F2 F3 F1 F4 F5 F6 F7 বাইরের পক্ষ process data store data flow trust boundary
এই ধাপে ছবিতে যা আছে
উপাদান
Zone
সীমানা পেরোনো তীর
  1. ধাপ ১ — বাইরের পক্ষ। প্রথমে লিখুন কারা সিস্টেমের সাথে কথা বলে, কিন্তু আপনার নিয়ন্ত্রণে নেই: পেমেন্ট গেটওয়ে, গ্রাহক আর support কর্মী। কর্মীরা আপনার প্রতিষ্ঠানের হলেও সিস্টেমের চোখে তাঁরা বাইরের মানুষ, তাই আয়তক্ষেত্র।
  2. ধাপ ২ — Process. কোন কোড ডেটা নিয়ে কাজ করে? Checkout API অর্ডার নেয়, Order service অর্ডার আর refund সামলায়। নামের চেয়ে দায়িত্ব জরুরি; একটিই server-এ চললেও দায়িত্ব আলাদা হলে আলাদা বৃত্ত আঁকতে পারেন।
  3. ধাপ ৩ — Data store. ডেটা কোথায় থামে? Orders DB-তে অর্ডার, Audit log-এ কে কী করলেন তার নথি। Backup, cache আর log ফাইলকেও ভুলবেন না; অনেক ফাঁস সেখান থেকেই হয়।
  4. ধাপ ৪ — Data flow. এবার তীর। F1 গ্রাহকের কার্ট আর session, F2 গেটওয়েতে পরিমাণ আর order id, F3 গেটওয়ের “paid” বার্তা, F4 নতুন অর্ডার, F5 অর্ডারের সারি, F6 audit-এর লেখা, F7 support-এর refund অনুরোধ। একটি নিয়ম: process ছাড়া ডেটা নড়ে না, তাই দুটি store বা দুটি বাইরের পক্ষের মধ্যে সরাসরি তীর দেখলে ছবিটি আবার ভাবুন।
  5. ধাপ ৫ — Trust boundary. প্রতিটি জায়গায় জিজ্ঞেস করুন: এখানে কি নিয়ন্ত্রণকারী, অধিকার বা নেটওয়ার্ক বদলাচ্ছে? App zone আর Data zone দাগানো হলো। গ্রাহক internet-এ, গেটওয়ে partner-এর হাতে, কর্মী staff network-এ, তাই তিনজনই আলাদা zone-এ। মোট ৫টি zone.
  6. ধাপ ৬ — সীমানা পেরোনো তীর। লাল তীরগুলো কাটা রেখা পেরিয়েছে: F1, F2, F3, F5, F6, F7. শুধু F4 একই zone-এ। এই ছয়টি তীরে প্রমাণ ছাড়া কিছু মানা চলবে না, তাই threat খোঁজা সেখান থেকেই শুরু করা ভালো। এর মানে এই নয় যে F4 নিরাপদ; শুধু অগ্রাধিকার পরে।

ছবিটি নিখুঁত হওয়া জরুরি নয়। Manifesto-র একটি সতর্কবার্তাই হলো “perfect representation”-এর পেছনে ছোটা। লক্ষ্য হলো দলের সবার মাথায় একই ছবি থাকা। ছবির পাশে অনুমানগুলোও লিখে রাখুন, যেমন “গেটওয়ের সাথে HTTPS ব্যবহার হয়” বা “support কর্মীরা অফিসের network থেকেই ঢোকেন”। অনেক threat লুকিয়ে থাকে ভুল অনুমানে।

৩ · প্রশ্ন ২: STRIDE — কোন অক্ষর কোন গুণ ভাঙে

ফাঁকা কাগজের সামনে “কী ভুল হতে পারে?” প্রশ্নটি খুব বড়। মানুষ তখন চেনা বিপদ ছাড়া কিছু ভাবতে পারেন না। STRIDE এই সমস্যার সহজ ওষুধ: ছয়টি অক্ষর, ছয়টি প্রশ্ন। প্রতিটি অক্ষর একটি নিরাপত্তা-গুণ ভাঙে।

অক্ষরThreatযে গুণ ভাঙেমূল প্রশ্নসাধারণ প্রতিরক্ষা
SSpoofing · ছদ্মবেশAuthenticationএ কি সত্যিই সে, যা দাবি করছে?MFA, স্বাক্ষর, mutual TLS
TTampering · বদলে দেওয়াIntegrityডেটা বদলালে কি ধরা পড়বে?TLS, HMAC, অধিকার সীমিত করা
RRepudiation · অস্বীকারNon-repudiation“আমি করিনি” বললে প্রমাণ আছে?Audit log, স্বাক্ষর
IInformation disclosure · ফাঁসConfidentialityঅধিকার ছাড়া কেউ দেখতে পাবে?Encryption, অধিকার যাচাই, মাস্কিং
DDenial of service · অচল করাAvailabilityএটি বন্ধ হলে কী হবে?Rate limit, queue, redundancy
EElevation of privilege · অধিকারের বাইরেAuthorizationকেউ প্রাপ্যের বেশি করতে পারবে?Least privilege, প্রতিটি কাজে যাচাই

STRIDE কোনো নিখুঁত শ্রেণিবিভাগ নয়, এটি মনে করিয়ে দেওয়ার হাতিয়ার। একটি threat দুই অক্ষরে পড়লে তর্ক করার দরকার নেই; তালিকায় ওঠাটাই আসল। পরিচিত একটি ভুল হলো E-কে শুধু “admin হওয়া” ভাবা। সাধারণ গ্রাহক অন্যের অর্ডার বদলাতে পারলেও সেটি E, আর দেখতে পারলে I-ও বটে।

এবার একটি তীর ধরে ছয়টি অক্ষর হাঁটি। বেছে নিচ্ছি F3: গেটওয়ে থেকে Checkout API-তে আসা “paid” webhook. কারণ এই একটি বার্তা শুনেই সিস্টেম পণ্য পাঠিয়ে দেয়।

  1. গেটওয়েpartner zoneআপনার নিয়ন্ত্রণের বাইরে
  2. F3order=ORD-1001amount=1200, paid
  3. Checkout APIapp zoneএরপর পণ্য পাঠানো শুরু
প্রতি ধাপে একটি অক্ষর
অক্ষর
কী ভুল হতে পারে
প্রতিরক্ষা
কীভাবে জানবেন কাজ করছে
  1. S — প্রেরক কে? Webhook-এর ঠিকানাটি internet-এ খোলা। শুধু “ঠিকানায় বার্তা এসেছে” দিয়ে প্রেরক প্রমাণ হয় না। গেটওয়ের সাথে ভাগ করা গোপন key দিয়ে তৈরি HMAC যাচাই করলে বোঝা যায় বার্তাটি key-ধারীর। HMAC-এর ভেতরের কথা পর্ব ৯-এ। সিদ্ধান্ত এখানে: যাচাই না মিললে অর্ডার বদলাবে না।
  2. T — ডেটা কি অক্ষত? TLS পথের বদল আটকায়, আর স্বাক্ষর বার্তার অখণ্ডতা দেখায়। তবু নিজের হিসাব মেলান: order ORD-1001-এর দাম ১,২০০ টাকা হলে বার্তায়ও 1200 থাকতে হবে। গেটওয়ের সঠিক বার্তাও ভুল অর্ডারের জন্য হতে পারে, তাই এই মিল ব্যবসার নিয়ম হিসেবে দরকার।
  3. R — প্রমাণ কোথায়? এক মাস পরে গেটওয়ে আর বাজার হিসাব মেলাতে বসলে কে কী পাঠিয়েছিল তার প্রমাণ লাগবে। তাই গ্রহণ করা প্রতিটি বার্তা event id, সময় আর ফলসহ রাখুন। একই event id দুবার এলে দ্বিতীয়বার কাজ না করার নিয়মও এখান থেকে আসে, যাকে idempotency বলে।
  4. I — কী ফাঁস হতে পারে? বার্তাটি TLS-এ সুরক্ষিত, কিন্তু আপনার log-এ পুরো অনুলিপি থাকলে ফোন নম্বর সেখানে জমবে। তাই log-এ যা লাগে শুধু তাই রাখুন, আর সংবেদনশীল অংশ মাস্ক করুন। মনে রাখুন, encryption পথ রক্ষা করে, আপনার log নয়।
  5. D — আটকে গেলে কী হবে? ভিড়ের দিনে বা ইচ্ছাকৃত চাপে handler আটকে গেলে “paid” গ্রাহকের অর্ডার ঝুলে যাবে। সমাধান হলো বার্তা দ্রুত গ্রহণ করে queue-তে রাখা, উৎসভেদে সীমা দেওয়া, আর স্বাক্ষর যাচাই ভারী কাজের আগেই করা।
  6. E — এই কোড কত ক্ষমতাধর? Handler-এর কোনো ত্রুটি বের হলে ক্ষতি কতদূর যাবে তা তার অধিকারই ঠিক করে। পুরো database-এ লেখার অধিকার থাকলে একটি ছোট ত্রুটিও বড় হয়। শুধু order status বদলানোর অধিকার দিলে ক্ষতির সীমা ছোট থাকে। এটি least privilege.
  7. সারাংশ। একটি তীর থেকে ছয়টি প্রশ্ন আর ছয়টি প্রতিরক্ষা। সব উত্তর সমান জরুরি নয়। জাল “paid” গ্রহণ মানে সরাসরি পণ্য হারানো, তাই S আর T সবার আগে। এই ক্রম ঠিক করার পদ্ধতি অংশ ৬-এ।

STRIDE-per-element: কোথায় কোন অক্ষর

প্রতিটি উপাদানে ছয়টি অক্ষর চালালে কাজ বিশাল হয়। তাই Microsoft-এর চর্চা থেকে এসেছে STRIDE-per-element: উপাদানের ধরন দেখে সাধারণত যেগুলো খাটে, সেগুলো ধরা। নিচের ছকটি বই ও tool-ভেদে সামান্য আলাদা হতে পারে, আর এটি শুরু করার পথ, দেয়াল নয়।

উপাদানSTRIDE
External entity✓✓
Process✓✓✓✓✓✓
Data store✓log হলে ✓✓✓
Data flow✓✓✓

লক্ষ করুন, ওপরের walk-এ আমরা একটি flow-তে ছয়টি অক্ষরই ব্যবহার করেছি। ছক অনুযায়ী S আর R আসলে প্রেরক গেটওয়ের ঘরে, E গ্রহণকারী process-এর ঘরে পড়ে। প্রশ্ন একই, শুধু কোন ঘরে লিখবেন তা আলাদা। নিচের ছোট simulator এই ছকটি আমাদের খেলনা DFD-তে চালায়। এটি শুধু একটি in-memory তালিকা পড়ে; কোনো সিস্টেমের সাথে যোগাযোগ করে না।

// খেলনা DFD: কাল্পনিক অনলাইন বাজারের checkout (শুধু ধারণার জন্য)
const RULES = { external: "SR", process: "STRIDE", store: "TID", flow: "TID" };
const el = {
  customer: { kind: "external", zone: "internet" },
  gateway:  { kind: "external", zone: "partner" },
  support:  { kind: "external", zone: "staff" },
  checkout: { kind: "process",  zone: "app" },
  orders:   { kind: "process",  zone: "app" },
  ordersDb: { kind: "store",    zone: "data" },
  auditLog: { kind: "store",    zone: "data", isLog: true },
};
const flows = [
  ["F1", "customer", "checkout"], ["F2", "checkout", "gateway"],
  ["F3", "gateway", "checkout"],  ["F4", "checkout", "orders"],
  ["F5", "orders", "ordersDb"],   ["F6", "orders", "auditLog"],
  ["F7", "support", "orders"],
];
let total = 0, onBoundary = 0;
for (const [name, e] of Object.entries(el)) {
  // log রাখা store-এ R-ও প্রযোজ্য: log বদলালে অস্বীকারের প্রমাণ হারায়
  const letters = e.isLog ? "TRID" : RULES[e.kind];
  total += letters.length;
  console.log(name.padEnd(9), e.kind.padEnd(8), letters.split("").join(" "));
}
for (const [id, a, b] of flows) {
  const za = el[a].zone, zb = el[b].zone, cross = za !== zb;
  total += RULES.flow.length;
  if (cross) onBoundary += RULES.flow.length;
  const tag = cross ? `CROSSES ${za} -> ${zb}` : "same zone";
  console.log(id, `${a} -> ${b}`.padEnd(20), "T I D ", tag);
}
console.log("Threat questions to ask:", total);
console.log("Of these on boundary-crossing flows:", onBoundary);

আউটপুটে প্রতি লাইনে একটি উপাদান আর তার অক্ষর, যেমন checkout process S T R I D E. শেষে Threat questions to ask: 46: হিসাবটি হলো ৩ পক্ষ × ২ + ২ process × ৬ + Orders DB ৩ + Audit log ৪ + ৭ flow × ৩ = ৪৬। এর মধ্যে Of these on boundary-crossing flows: 18, অর্থাৎ ছয়টি সীমানা-পেরোনো তীর × ৩। ৪৬টি হলো প্রশ্ন, threat নয়। অনেক প্রশ্নের উত্তর হবে “এখানে প্রযোজ্য নয়”, আর সেটিও একটি লিখে রাখার মতো সিদ্ধান্ত। আপনি চাইলে flows-এ একটি নতুন তীর জুড়ে আবার চালান।

৪ · Attack surface — কতগুলো দরজা খোলা, আর কোনগুলো লাগবেই না

আপনার বাসায় যত দরজা-জানালা, পাহারা দিতে হয় তত জায়গায়। ব্যবহার না হওয়া ছাদের দরজাটি ইট দিয়ে গেঁথে ফেললে সেখানে তালাও লাগে না, পাহারাও লাগে না। এই চিন্তাই attack surface: সিস্টেমের সেই সব জায়গার মোট পরিসর, যেখান দিয়ে বাইরের কেউ ডেটা ঢোকাতে, ডেটা বের করতে বা কোনো কাজ করাতে পারে।

Attack surface শুধু API নয়। কয়েকটি স্তরে ভাবুন:

🌐 Network আর application

খোলা port, API, login, file upload, webhook, admin panel. প্রতিটি entry point একটি দরজা।

🧩 Software

Library, plugin, checkout পাতায় বসানো তৃতীয় পক্ষের script, CI/CD pipeline. আপনার না লেখা কোডও আপনার পরিসরে।

🧑 মানুষ আর প্রক্রিয়া

Support-এর ফোন লাইন, password reset, কর্মীর email. একজন বিভ্রান্ত মানুষও একটি দরজা।

🏢 ভৌত আর সরবরাহকারী

অফিসের ল্যাপটপ, backup-এর ডিস্ক, vendor-এর remote access. এগুলোও তালিকায় উঠবে।

কীভাবে মাপবেন

কোনো একক সর্বজনীন একক নেই। গবেষণায় Michael Howard, Jon Pincus আর Jeannette Wing “relative attack surface” ধারণা নিয়ে কাজ করেছেন, আর Manadhata ও Wing সিস্টেমের entry আর exit point, channel এবং অবিশ্বস্ত ডেটা ধরে একটি metric প্রস্তাব করেছেন। মূল কথাটি সহজ: সব দরজা সমান নয়। লগইন ছাড়া খোলা একটি দরজার ঝুঁকি লগইনের পেছনের দরজার চেয়ে বেশি।

দলের ভেতরের কাজের জন্য একটি সহজ ওজন-ভিত্তিক গণনা যথেষ্ট। নিচের ওজনগুলো ধরে নেওয়া, কোনো মান নয়। লক্ষ্য একই সিস্টেমের আগের আর পরের তুলনা, দুই কোম্পানির তুলনা নয়।

পরিসরের ধরনধরে নেওয়া ওজনআগে (সংখ্যা × ওজন)পরে (সংখ্যা × ওজন)
লগইন ছাড়া endpoint৩১০ × ৩ = ৩০৬ × ৩ = ১৮
লগইন লাগে এমন endpoint১১৪ × ১ = ১৪১২ × ১ = ১২
Internet-এ খোলা admin কাজ৫৩ × ৫ = ১৫০ (ভেতরের access-এ, ৩ × ১ = ৩)
Checkout পাতায় তৃতীয় পক্ষের script২৬ × ২ = ১২২ × ২ = ৪
মোট৭১৩৭

কমেছে (৭১ − ৩৭) ÷ ৭১ ≈ ৪৭.৯ শতাংশ। সংখ্যাটি নিজে থেকে “এতটা নিরাপদ” বলে না, শুধু দেখায় পরিসর ছোট হয়েছে। ছোট পরিসরেও একটি মারাত্মক ত্রুটি থাকতে পারে, আর বড় পরিসরও ভালোভাবে রক্ষিত হতে পারে।

কীভাবে কমাবেন

  • বাদ দিন: ব্যবহার না হওয়া endpoint, পুরোনো API version, debug পাতা। সবচেয়ে সস্তা আর সবচেয়ে কার্যকর প্রতিরক্ষা হলো ফিচারটি না রাখা।
  • লুকাবেন না, সরান: Admin কাজ internet থেকে সরিয়ে ভেতরের access-এ নিন। শুধু ঠিকানা গোপন রাখা প্রতিরক্ষা নয়।
  • আগে পরিচয়, পরে কাজ: ভারী কাজ চালানোর আগে authentication আর স্বাক্ষর যাচাই করুন।
  • অধিকার ছোট করুন: প্রতিটি process শুধু দরকারি table আর দরকারি কাজ পাবে।
  • ডেটা কম রাখুন: যা রাখছেন না, তা ফাঁস হতে পারে না।
  • নজর রাখুন: নতুন endpoint বা নতুন script যোগ হলে তালিকাও বদলাবে। তাই পরিসরের তালিকা একবারের কাজ নয়।

৫ · Attack tree — রক্ষকের চোখে “কীভাবে ঘটতে পারে”

STRIDE ছবি ধরে খোঁজে। Attack tree শুরু হয় উল্টো দিক থেকে: একটি অবাঞ্ছিত ফল ধরে। Bruce Schneier ১৯৯৯ সালে Dr. Dobb's Journal-এ ধারণাটি জনপ্রিয় করেন। গাছের মূলে থাকে লক্ষ্য, আর ডালে সেটি ঘটার সম্ভাব্য পথ। ডাল দুই রকম:

  • OR ডাল: যেকোনো একটি পথ যথেষ্ট। তাই রক্ষককে সব পথ বন্ধ করতে হয়। গাছের শক্তি তার সবচেয়ে দুর্বল ডালের সমান।
  • AND ডাল: সবগুলো ধাপ একসাথে লাগে। তাই রক্ষক একটি ভাঙলেই পথটি বন্ধ।

এখানে আমরা গাছটিকে ব্যবহার করি রক্ষার মানচিত্র হিসেবে। ডালে ব্যবস্থার দুর্বলতার নাম থাকে, কৌশলের বিবরণ নয়, আর প্রতিটি ডালের পাশে থাকে প্রতিরক্ষা। প্রচেষ্টার সংখ্যাগুলো ধরে নেওয়া আপেক্ষিক মান, ১ থেকে ৯ মাপে।

রক্ষকের attack tree — প্রতিরক্ষাসহ

A defender's attack tree with mitigations on each branch

রক্ষকের attack tree লক্ষ্য: টাকা না পেয়েও পণ্য বা টাকা বের হওয়া OR ডাল · সবচেয়ে সহজ পথ = min(২, ৪, ৮) = ২ A · জাল “paid” বার্তা গ্রহণ — প্রচেষ্টা ২ রক্ষা: স্বাক্ষর আর পরিমাণ যাচাই → ৯ B · client-এর দাম মেনে নেওয়া — প্রচেষ্টা ৪ রক্ষা: দাম শুধু server থেকে → ৯ C · একা refund (AND ডাল) — ৫ + ৩ = ৮ C1 · support account দখল — ৫ রক্ষা: MFA আর ছোট session C2 · একজনের অনুমোদনই যথেষ্ট — ৩ রক্ষা: দুজনের অনুমোদন → ৯
ছবি ৪.১ — OR ডালে সবচেয়ে সহজ পথই গাছের মান, AND ডালে প্রচেষ্টা যোগ হয়। সবুজ লেখা প্রতিরক্ষা আর তার পরের ধরে নেওয়া প্রচেষ্টা।

গাছটি দিয়ে হিসাব করুন। OR-এ সর্বনিম্ন, AND-এ যোগফল নিই। প্রচেষ্টা যত বেশি, রক্ষা তত ভালো।

কোন প্রতিরক্ষার পরেABCমূলের মান (সর্বনিম্ন)
শুরুতে২৪৫ + ৩ = ৮২
A ঠিক করার পরে৯৪৮৪
B-ও ঠিক করার পরে৯৯৮৮
C2-তে দুজনের অনুমোদন দিলে৯৯৫ + ৯ = ১৪৯

শিক্ষাটি পরিষ্কার। সবচেয়ে সহজ পথ বন্ধ না করে অন্য ডালে যত খরচই করুন, মূলের মান বদলাবে না। আর AND ডালে একটি অংশ শক্ত করলেই পুরো পথ কঠিন হয়। এই কারণেই একটি মাত্র দুর্বল ডাল দিয়ে নিরাপত্তা বিচার হয়, সবচেয়ে শক্ত ডাল দিয়ে নয়।

Attack tree রক্ষকের দলিল হিসেবেও সংবেদনশীল। আপনার সিস্টেমের দুর্বল ডালগুলো এতে লেখা থাকে। তাই এটি access-সীমিত জায়গায় রাখুন, যেমন যে কোনো ভেতরের নিরাপত্তা-নথি রাখেন।

৬ · কোন ঝুঁকি আগে — DREAD, risk ranking আর likelihood × impact

Threat-এর তালিকা হাতে এলে নতুন সমস্যা: সময় আর টাকা সীমিত। ধানমন্ডির দোকানদার জানেন, ঈদের আগে দোকানে আগে কোন দিকটি সামলাতে হবে। সব বিপদ সমান নয়। এই ক্রম ঠিক করার কয়েকটি উপায় আছে, আর প্রত্যেকটির দুর্বলতাও আছে।

DREAD আর কেন সে পিছিয়ে পড়ল

DREAD Microsoft-এর প্রথম দিকের নিরাপত্তা-উদ্যোগের সময় এসেছিল, আর Howard ও LeBlanc-এর Writing Secure Code বইয়ের মাধ্যমে পরিচিত হয়। পাঁচটি প্রশ্নে স্কোর দিয়ে গড় নেওয়া হয়: Damage (ক্ষতি কত), Reproducibility (কত সহজে আবার ঘটে), Exploitability (কত সহজে ঘটানো যায়), Affected users (কতজন আক্রান্ত), Discoverability (কত সহজে খুঁজে পাওয়া যায়)। স্কোরের মাপ উৎসভেদে আলাদা, কোথাও ০–১০, কোথাও ১–৩।

সমস্যা দেখুন। একই threat-কে দুজন রিভিউয়ার দুভাবে দেখলেন, মতভেদ শুধু একটি ঘরে:

রিভিউয়ারDREADগড়৭ সীমায় ফল
প্রথমজন (“সবাই খুঁজে পাবে”)৮৯৭৬৯৩৯ ÷ ৫ = ৭.৮উঁচু
দ্বিতীয়জন (“কে আর খুঁজবে”)৮৯৭৬৩৩৩ ÷ ৫ = ৬.৬মাঝারি

একই সমস্যা, দুই সিদ্ধান্ত। Shostack-এর ২০১৮ সালের লেখা অনুযায়ী, মাঝের স্কোরে মানুষ একমত হন না, আর discoverability সময়ের সাথে বদলায়। আরেকটি বড় অসুবিধা ছিল বাইরের গবেষকদের জানানো ত্রুটিতে: এক ত্রুটি দুই পদ্ধতিতে দুই মান পেত। তিনি লিখেছেন, এই অভিজ্ঞতাই Microsoft-কে bug bar পদ্ধতির দিকে নিয়ে যায়, যেখানে আগে থেকে লেখা থাকে কোন ধরনের ত্রুটি কত গুরুতর। ঠিক কবে এবং কোন আনুষ্ঠানিক ঘোষণায় এই বদল হয়েছিল, তার নিশ্চিত তথ্য আমরা পাইনি। তবে DREAD পুরোপুরি হারিয়ে যায়নি, কিছু দল এখনো এটি বা এর রূপান্তর ব্যবহার করে। Discoverability নিয়ে আরেকটি নীতিগত আপত্তি হলো, এটি “লুকানো আছে, তাই নিরাপদ” ভাবনাকে পুরস্কার দেয়, যা পর্ব ৭-এর Kerckhoffs-এর নীতির উল্টো।

Likelihood × impact

সবচেয়ে প্রচলিত হিসাবটি সহজ: likelihood (ঘটার সম্ভাবনা) আর impact (ঘটলে ক্ষতি), দুটিই ১ থেকে ৫ মাপে, তারপর গুণ।

ঝুঁকির স্কোর = likelihood × impact
উদাহরণ: L = ৪, I = ৫ হলে ৪ × ৫ = ২০ (সর্বোচ্চ ২৫)

এই পর্বে আমরা ধরে নিচ্ছি: ১৫ বা বেশি উঁচু, ৮ থেকে ১৪ মাঝারি, ৭ বা কম নিচু। এই risk matrix-এর সীমা প্রতিষ্ঠানভেদে আলাদা। সংজ্ঞাও এক নয়: NIST SP 800-30 ঝুঁকিকে সম্ভাবনা আর প্রভাবের ফল হিসেবে দেখে, ISO 31000 একে অনিশ্চয়তার প্রভাব বলে, আর অনেক বই threat × vulnerability × asset-এর মতো রূপ লেখে। পরীক্ষায় যে সংজ্ঞা চাওয়া হয়েছে, সেটি অনুসরণ করুন।

Risk ranking আরও সহজও হতে পারে। শুরুতে দল শুধু উঁচু, মাঝারি, নিচু বলে সাজাতে পারে, অথবা তালিকায় দুটি করে threat তুলনা করে বলতে পারে কোনটি আগে। ছোট দলে এটিই প্রায়ই যথেষ্ট।

সংখ্যার ফাঁদ: ১–৫ হলো ক্রমবাচক মান, মাপা সংখ্যা নয়। “৪” মানে “২”-এর দ্বিগুণ সম্ভাবনা নয়। L৫ × I১ = ৫ আর L১ × I৫ = ৫ স্কোরে সমান, অথচ প্রথমটি রোজকার ছোট ঝামেলা, দ্বিতীয়টি কদাচিৎ-আসা মহাবিপদ। Louis Anthony Cox-এর ২০০৮ সালের প্রবন্ধ “What's Wrong with Risk Matrices?” এমন সীমাবদ্ধতাই দেখায়। তাই স্কোর দিয়ে আলোচনা শুরু করুন, শেষ করবেন মানুষের যুক্তি দিয়ে।

সিদ্ধান্তও শুধু “ঠিক করা” নয়। প্রতিটি threat-এর জন্য সাধারণত চারটি পথ থাকে:

সিদ্ধান্তঅর্থCheckout-এর উদাহরণ
Eliminate · বাদ দেওয়াযে ফিচার বা ডেটা থেকে ঝুঁকি, সেটিই সরানকার্ডের তথ্য নিজের database-এ না রাখা
Mitigate · কমানোMitigation বসানোWebhook-এর স্বাক্ষর যাচাই
Transfer · অন্যের হাতেদায় আংশিক বদলানো, পুরো দায় যায় নাগেটওয়ের পাতায় পেমেন্ট, cyber বিমা
Accept · মেনে নেওয়াদায়িত্বশীল ব্যক্তি লিখিতভাবে মেনে নেননিচু ঝুঁকির ছোট ত্রুটি, তারিখসহ

প্রতিরক্ষার পরেও যা থেকে যায়, তা residual risk. কেউ যেন চুপচাপ না মানে, তাই “accept” সবসময় নাম আর তারিখসহ লিখে রাখুন। আর CVSS-এর সাথে গুলিয়ে ফেলবেন না: CVSS পরিচিত vulnerability-র তীব্রতা মাপে (পর্ব ৩২), threat model নকশার ঝুঁকি খোঁজে। টাকার হিসাবে ঝুঁকি মাপার পদ্ধতি FAIR আসবে পর্ব ৬৮-তে।

৭ · প্রশ্ন ৩ আর ৪: threat থেকে test আর backlog

অনেক threat model এখানেই মারা যায়: একটি সুন্দর দলিল, শেয়ার্ড ড্রাইভে ঘুমিয়ে। মহল্লার পাহারা কমিটি বসে যদি শুধু আলোচনা করে, কিন্তু কারও নামে কোনো দায়িত্ব না পড়ে, তাহলে রাতে কেউ পাহারা দেবে না। সফটওয়্যারে দায়িত্ব মানে backlog item, আর প্রমাণ মানে test. নিচে T1 threat-টিকে ধাপে ধাপে কাজে বদলানো দেখুন।

  1. ThreatT1স্পষ্ট বাক্য
  2. সিদ্ধান্তmitigateঝুঁকি ২০
  3. নিয়মREQকী হতেই হবে
  4. TestTCপ্রমাণ
  5. BacklogSEC-41মালিক আর তারিখ
threat statementকে, কী, কেন, কী ক্ষতি
T1 (F3, S+T)
Actor : যে কেউ, যে webhook ঠিকানাটি জানে
Action: গেটওয়ে না হয়েও একটি "paid" বার্তা পাঠানো
Why   : আমরা বার্তার উৎস যাচাই করি না
Impact: টাকা ছাড়াই পণ্য বের হয়
Asset : বিক্রির টাকা, মজুদ
decisionL=4, I=5
Risk     : 4 x 5 = 20 (উঁচু)
Decision : mitigate
Owner    : payment দল
Residual : L=1, I=5 --> 5
security requirementপরীক্ষা করা যায় এমন বাক্য
REQ-T1-a  স্বাক্ষর না মিললে বার্তা বাতিল, অর্ডার অপরিবর্তিত
REQ-T1-b  amount অর্ডারের মোটের সমান না হলে অর্ডার আটকে alert
REQ-T1-c  একই event id দ্বিতীয়বার এলে কোনো কাজ নয়
REQ-T1-d  প্রতিটি বাতিল বার্তা log হবে
test caseনিজের test পরিবেশে, খেলনা ডেটায়
TC-T1-1  (নিজের test পরিবেশ)
Given  order ORD-1001 আছে, status=pending, total=1200
When   স্বাক্ষরহীন একটি paid বার্তা test API-তে আসে
Then   উত্তর 401
And    ORD-1001-এর status এখনো pending
And    log-এ "webhook_rejected" আছে
backlog itemদলের স্বাভাবিক কাজের তালিকায়
SEC-41  Webhook স্বাক্ষর আর পরিমাণ যাচাই
Priority : উঁচু (T1, risk 20)
Estimate : 2 person-day
Owner    : payment দল
Done when: TC-T1-1 থেকে TC-T1-4 CI-তে সবুজ
           key rotation-এর নিয়ম লেখা হয়েছে
threat registerপ্রশ্ন ৪: কাজটি কি ভালো হলো?
T1  status: closed-by-test   evidence: TC-T1-1..4
    residual: 5 (accepted, payment দল)
    review  : গেটওয়ে বদলালে আবার দেখতে হবে
Alert: webhook_rejected হঠাৎ বাড়লে on-call জানবে
  1. ধাপ ১ — পরিষ্কার বাক্য। “হ্যাকার ঢুকতে পারে” কোনো threat নয়, কারণ তা দিয়ে কিছু করা যায় না। লিখুন কে, কী করতে পারে, কেন পারে, ফল কী, কোন সম্পদ। এখানে কারণটি হলো উৎস যাচাই নেই, আর ক্ষতি হলো টাকা ছাড়া পণ্য।
  2. ধাপ ২ — সিদ্ধান্ত আর মালিক। L = ৪, I = ৫, তাই ঝুঁকি ২০, উঁচু। সিদ্ধান্ত mitigate. প্রতিরক্ষার পরে likelihood ১-এ নামবে ধরে নিলে residual risk ১ × ৫ = ৫. Impact বদলায় না, কারণ ঘটলে ক্ষতি একই থাকে। একজন মালিক ছাড়া কোনো সিদ্ধান্ত বাস্তব হয় না।
  3. ধাপ ৩ — পরীক্ষা করা যায় এমন নিয়ম। “Webhook নিরাপদ হবে” পরীক্ষা করা যায় না। কিন্তু “স্বাক্ষর না মিললে অর্ডার বদলাবে না” যায়। ভালো security requirement-এ “না করবে” ধরনের আচরণও লেখা থাকে। Requirement লেখার ধরন Software Engineering কোর্সে আছে।
  4. ধাপ ৪ — Negative test. সাধারণ test দেখে সঠিক ইনপুটে কাজ হয় কি না। Threat থেকে আসা test দেখে ভুল ইনপুটে সিস্টেম কী করে না। এখানে নিজের test পরিবেশে একটি স্বাক্ষরহীন বার্তা দিলে উত্তর 401, আর ORD-1001 এখনো pending. চলমান production-এ বা অন্যের সিস্টেমে এমন পরীক্ষা নয়।
  5. ধাপ ৫ — Backlog item. নিরাপত্তার কাজ আলাদা তালিকায় থাকলে হারিয়ে যায়। তাই এটি দলের সাধারণ backlog-এ ওঠে, অন্য কাজের মতো অগ্রাধিকার আর সময়সহ। Acceptance criteria হিসেবে test-এর নাম লেখা থাকে, যাতে “শেষ” কথাটির অর্থ পরিষ্কার হয়।
  6. ধাপ ৬ — প্রশ্ন ৪. Test CI-তে সবুজ হলে threat register-এ প্রমাণসহ বন্ধ করুন। বাতিল বার্তা গোনা একটি detection-ও দেয়: হঠাৎ বেড়ে গেলে on-call জানবেন। কিন্তু মডেল চিরকাল ঠিক থাকে না। গেটওয়ে বদলালে বা নতুন flow এলে আবার দেখতে হবে।

“ভালো হলো কি না” যাচাইয়ের আরও কিছু প্রশ্ন: ছবিটি কি আজকের সিস্টেমের সাথে মেলে? প্রতিটি threat-এর কি সিদ্ধান্ত আছে? সব উঁচু ঝুঁকির কি test আছে? দলের বাইরের একজন পড়ে কি বুঝবেন? পরে কোনো incident হলে সেটি মডেলে ছিল কি না মিলিয়ে দেখুন; না থাকলে মডেলে যোগ করুন। Incident থেকে শেখার ধারা Cloud & DevOps কোর্সে দেখতে পারেন, আর এই কোর্সে পর্ব ৬১-তে আসবে।

৮ · দলের কাজে threat modeling, আর অন্য পদ্ধতি

বড় অনুষ্ঠানের মতো বছরে একবার threat modeling করলে কাজ হয় না, কারণ সিস্টেম প্রতি সপ্তাহে বদলায়। Manifesto-র নীতি হলো “early and often”, আর দলের চলমান কাজের ধারার সাথে মিলিয়ে ছোট ছোট অংশে করা। বাস্তবে এটি এমন দেখায়:

কখনকী করবেনমোটামুটি সময়
নতুন বড় ফিচারের নকশায়DFD আর STRIDE নিয়ে দলগত বৈঠক৬০–৯০ মিনিট
Sprint planning-এএই কাজে নতুন trust boundary, ডেটা বা অধিকার আছে কি?৫ মিনিট
Code review-এনতুন endpoint বা তৃতীয় পক্ষ যোগ হলে মডেল হালনাগাদকয়েক মিনিট
Release-এর আগেউঁচু ঝুঁকির সিদ্ধান্ত আর test মিলিয়ে দেখা১৫ মিনিট
Incident-এর পরেমডেলে কী ছিল না, তা যোগ করাপর্যালোচনার অংশ

সময়গুলো দিকনির্দেশনার জন্য, কোনো মান নয়। বৈঠকে developer, tester, operations, আর সম্ভব হলে support ও ব্যবসার একজন রাখুন। Refund-এর ফাঁক প্রায়ই support কর্মীই সবচেয়ে ভালো জানেন। ছবি রাখুন কোডের পাশে, যাতে পরিবর্তনের সাথে সেটিও বদলায়। Threat register-কেও সাধারণ ফাইল বা issue হিসেবে রাখা যায়। পুরো secure SDLC-তে এর জায়গা দেখবেন পর্ব ৪৫-এ, আর CI/CD-র দিকটি DevSecOps পর্বে।

অন্য পদ্ধতি — একটি সংক্ষিপ্ত নোট

STRIDE একমাত্র পথ নয়। কাজ অনুযায়ী অন্যগুলোও দেখা যায়:

PASTA

PASTA (Process for Attack Simulation and Threat Analysis) ব্যবসার লক্ষ্য থেকে শুরু হয়ে সাত ধাপে ঝুঁকি ও প্রভাব বিশ্লেষণে যায়। UcedaVélez আর Morana-র নামে পরিচিত। ভারী, কিন্তু ব্যবসার ঝুঁকির সাথে যোগ শক্ত।

যখন: বড় প্রতিষ্ঠান, ব্যবসা-কেন্দ্রিক বিশ্লেষণ

LINDDUN

LINDDUN KU Leuven-এর DistriNet গবেষকদের তৈরি, privacy-র জন্য। সাত শ্রেণি: Linking, Identifying, Non-repudiation, Detecting, Data disclosure, Unawareness & unintervenability, Non-compliance. পুরোনো লেখায় নামগুলো সামান্য আলাদা।

যখন: ব্যক্তিগত তথ্য বেশি (পর্ব ৭০)

একটি মজার অমিল লক্ষ করুন: STRIDE-এ non-repudiation রক্ষা করার গুণ, কিন্তু LINDDUN-এ non-repudiation নিজেই একটি threat. ব্যবসা চায় কে কী করেছেন তার প্রমাণ, আর privacy চায় মানুষকে অকারণে শনাক্ত না করা। দুটি লক্ষ্য কখনো টানাটানি করে, যেমন বেনামি অভিযোগের ব্যবস্থায়।

Tool হিসেবে খোলা উৎসের OWASP Threat Dragon বা Microsoft Threat Modeling Tool-এর মতো জিনিস আছে, তবে হোয়াইটবোর্ড আর একটি মার্কারও চলে। Tool চিন্তার জায়গা নিতে পারে না; এটি Manifesto-র মূল কথাগুলোর একটি।

আরও গভীরে: STRIDE-per-element ছাড়াও “STRIDE-per-interaction” নামে একটি রূপ আছে, যেখানে প্রতিটি উপাদান নয়, উপাদানের জোড়ার যোগাযোগ ধরে খোঁজা হয়। Shostack-এর বইয়ে threat modeling-কে asset-কেন্দ্রিক, attacker-কেন্দ্রিক আর software-কেন্দ্রিক দৃষ্টিতে ভাগ করে আলোচনা আছে, আর তিনি software-কেন্দ্রিক শুরুকে বেশি কাজের মনে করেন। MITRE-এর CAPEC আক্রমণের ধরনের একটি ক্যাটালগ, যা threat খোঁজায় চিন্তার খোরাক দেয়। NIST SP 800-218 (SSDF) নকশার ঝুঁকি বিশ্লেষণকে নিরাপদ software তৈরির চর্চার অংশ হিসেবে দেখে।

৯ · পূর্ণ উদাহরণ — কাল্পনিক বাজারের checkout

এবার সব জোড়া দিই। একটি কাল্পনিক অনলাইন বাজারের দল ঈদের আগে নতুন checkout চালু করবে। তাদের হাতে এক sprint-এ ৮ person-day নিরাপত্তার কাজের সময়। সব স্কোর উদাহরণের জন্য ধরে নেওয়া।

প্রশ্ন ১ — কী নিয়ে কাজ করছি? Scope হলো অংশ ২-এর DFD. Scope-এর বাইরে: বিক্রেতার panel. অনুমান: কার্ডের তথ্য গেটওয়ের পাতাতেই নেওয়া হয়, আমাদের কাছে আসে না; গেটওয়ের সাথে একটি গোপন key ভাগ করা আছে; support কর্মীরা নিজ account-এ ঢোকেন। সম্পদ: বিক্রির টাকা, গ্রাহকের ফোন-ঠিকানা, অর্ডারের সঠিকতা, ঈদের সময় সেবা চালু থাকা।

প্রশ্ন ২ — কী ভুল হতে পারে? দল ৪৬টি প্রশ্ন ধরে এগিয়ে এই সাতটি threat লিখল:

IDকোথায়STRIDEThreatLIঝুঁকি
T1F3S, Tজাল “paid” বার্তা গৃহীত হয়৪৫২০ উঁচু
T2F1TServer client-এর পাঠানো দাম মেনে নেয়৪৪১৬ উঁচু
T3Order serviceE, Iলগইন করা গ্রাহক অন্যের অর্ডার দেখেন৩৫১৫ উঁচু
T4F7E, Rএকজন support কর্মী একাই বড় refund দেন৩৪১২ মাঝারি
T5Checkout APIDভিড় বা ইচ্ছাকৃত চাপে checkout অচল৩৩৯ মাঝারি
T6Audit logT, RAudit log মোছা বা বদলানো যায়২৪৮ মাঝারি
T7F3-র app logILog-এ ফোন আর ঠিকানা পুরো থাকে৩৩৯ মাঝারি

প্রশ্ন ৩ — কী করব? দলের নিয়ম দুটি: ঝুঁকি ১৫ বা বেশি হলে আগে, বড় থেকে ছোট ক্রমে; বাকিগুলো সাজানো হবে প্রতি person-day-তে কতটা ঝুঁকি কমে তা দিয়ে। নিচের tool ঠিক এই হিসাব করে। left হলো প্রতিরক্ষার পরের ধরে নেওয়া ঝুঁকি, আর /day হলো (risk − left) ÷ days. এটি খেলনা হিসাব, in-memory তালিকার ওপর।

// সব স্কোর ধরে নেওয়া: L, I = 1..5; rL, rI = প্রতিরক্ষার পরে; days = person-day
const threats = [
  { id: "T1", fix: "Verify webhook signature+amount", L: 4, I: 5, rL: 1, rI: 5, days: 2 },
  { id: "T2", fix: "Price from server only",          L: 4, I: 4, rL: 1, rI: 4, days: 1 },
  { id: "T3", fix: "Ownership check on orders",       L: 3, I: 5, rL: 1, rI: 5, days: 2 },
  { id: "T4", fix: "Two-person refund approval",      L: 3, I: 4, rL: 1, rI: 4, days: 3 },
  { id: "T5", fix: "Rate limit and queue checkout",   L: 3, I: 3, rL: 2, rI: 2, days: 2 },
  { id: "T6", fix: "Append-only audit log",           L: 2, I: 4, rL: 1, rI: 4, days: 2 },
  { id: "T7", fix: "Mask phone/address in logs",      L: 3, I: 3, rL: 1, rI: 3, days: 1 },
];
const MUST = 15, BUDGET = 8; // নীতি: ঝুঁকি >= 15 হলে আগে; এই sprint-এ 8 দিন
for (const t of threats) {
  t.risk = t.L * t.I;
  t.left = t.rL * t.rI;
  t.perDay = (t.risk - t.left) / t.days;
}
const must = threats.filter(t => t.risk >= MUST).sort((a, b) => b.risk - a.risk);
const rest = threats.filter(t => t.risk < MUST).sort((a, b) => b.perDay - a.perDay);
let used = 0, n = 0;
const later = [];
console.log("#  id risk left /day days  mitigation");
for (const t of [...must, ...rest]) {
  if (used + t.days > BUDGET) { later.push(t); continue; }
  used += t.days;
  console.log(String(++n).padEnd(2), t.id, String(t.risk).padStart(4),
    String(t.left).padStart(4), t.perDay.toFixed(1).padStart(4),
    String(t.days).padStart(4), " " + t.fix);
}
console.log("Days used:", used, "of", BUDGET);
for (const t of later)
  console.log("Next sprint:", t.id, "risk", t.risk, "-", t.fix);

আউটপুটের প্রথম তিন সারি উঁচু ঝুঁকি: T1 (২০), T2 (১৬), T3 (১৫)। এরপর T7 আসে /day ৬.০ নিয়ে, কারণ (৯ − ৩) ÷ ১ = ৬. তারপর T4-এর পালা, /day (১২ − ৪) ÷ ৩ ≈ ২.৭, কিন্তু তখন ৮ দিনের ৬ দিন শেষ, ৩ দিন ধরে না। তাই T5 ঢোকে, আর শেষ লাইন Days used: 8 of 8. পরের sprint-এ যায় Next sprint: T4 risk 12 আর T6 risk 8. ঝুঁকি ১২-র কাজ বাদ পড়ে ৯-এর কাজ ঢুকেছে; এটি নিয়মের ফল, আর এখানেই মানুষের বিচার লাগে। দল চাইলে T5 আর T7 সরিয়ে T4 নিতে পারে। MUST বা BUDGET বদলে আবার চালিয়ে দেখুন।

দল আলোচনা করে ক্রমটি রাখল, কারণ ঈদের ভিড়ে T5-এর দাম বেশি। তবে T4-এর জন্য একটি অস্থায়ী নিয়ন্ত্রণ যোগ করল। চূড়ান্ত তালিকা:

ক্রমMitigationThreatঝুঁকি → পরেপ্রমাণ (test বা detection)
১Webhook-এর স্বাক্ষর আর পরিমাণ যাচাইT1২০ → ৫স্বাক্ষরহীন বার্তায় 401, অর্ডার অপরিবর্তিত
২দাম শুধু server-এর তালিকা থেকেT2১৬ → ৪ভিন্ন দামের অনুরোধেও মোট server-এর হিসাবে
৩প্রতিটি অর্ডার পড়ায় ownership যাচাইT3১৫ → ৫অন্য গ্রাহকের test account-এ 403 বা 404 (পর্ব ৩৮)
৪Log-এ ফোন-ঠিকানা মাস্কT7৯ → ৩Log নমুনা স্ক্যানে পুরো নম্বর নেই
৫Rate limit আর checkout queueT5৯ → ৪Load test-এ checkout সাড়া দেয়
পরের sprintRefund-এ maker-checker; তখন পর্যন্ত প্রতিদিন refund তালিকা হাতে মেলানোT4১২ → ৪একজনের অনুমোদনে বড় refund ব্যর্থ
পরের sprintAppend-only audit logT6৮ → ৪App-এর অধিকারে log মোছা যায় না

প্রশ্ন ৪ — কাজটি কি ভালো হলো? Release-এর আগে দল মিলিয়ে দেখল উঁচু তিনটির test সবুজ, DFD-তে একটি নতুন flow বাদ পড়েনি, আর T4-এর অস্থায়ী নিয়ন্ত্রণের একজন মালিক আছেন। ঈদের পরে তারা মডেলটি আবার খুলবে। এটিই পুরো চক্র: একটি ছবি, সাতটি threat, পাঁচটি কাজ, আর দুটি লিখিত স্থগিত সিদ্ধান্ত।

পরীক্ষা ও ইন্টারভিউতে: এ ধরনের প্রশ্ন আসতে পারে।
STRIDE-এর পূর্ণরূপ ও ভাঙা গুণ? S-authentication, T-integrity, R-non-repudiation, I-confidentiality, D-availability, E-authorization.
Trust boundary কী? যেখানে বিশ্বাসের মাত্রা বদলায়, তাই ডেটা যাচাই করতে হয়।
Attack surface আর vulnerability-র পার্থক্য? প্রথমটি যাওয়ার সব পথের পরিসর, দ্বিতীয়টি নির্দিষ্ট দুর্বলতা।
OR আর AND ডালের হিসাব? OR-এ সবচেয়ে সহজ পথ, AND-এ সব ধাপের যোগফল।
DREAD-এর প্রধান সমালোচনা? বিষয়নির্ভর স্কোর, মানুষভেদে ফল আলাদা।

১০ · AI-এর যুগে threat modeling

AI threat model-এর খসড়া খুব দ্রুত বানাতে পারে, আর ভুলে যাওয়া প্রশ্ন মনে করিয়ে দিতে পারে। কিন্তু AI আপনার ব্যবসা জানে না, আপনার সিস্টেম দেখে না, আর ভুল উত্তরও আত্মবিশ্বাসের সাথে দেয়। তাই একে ভাবুন দ্রুত লিখতে পারা একজন নতুন সহকর্মী হিসেবে, যাঁর সব কাজ যাচাই করতে হয়।

AI-এর ভুলকেন বিপজ্জনককী করবেন
সাধারণ threat-এর লম্বা তালিকাআপনার ব্যবসার নিয়মের ফাঁক (দাম, refund) বাদ পড়েনিজের DFD আর ব্যবসার নিয়ম দিন, উপাদান ধরে উত্তর চান
অস্তিত্বহীন CVE বা standard-এর নম্বর বানানোভুল সূত্রে সিদ্ধান্ত হয়মূল উৎসে খুঁজে নিশ্চিত হন
পুরোনো পরামর্শ (MD5, ECB, salt ছাড়া hash)দুর্বল প্রতিরক্ষা নিরাপদ বলে মনে হয়বর্তমান NIST বা OWASP নির্দেশনা মেলান
Error সারাতে যাচাই বন্ধের পরামর্শ (verify=False, chmod 777, খোলা CORS)যে প্রতিরক্ষা নিয়ে কাজ, সেটিই উধাওDiff পড়ুন, মূল কারণ ঠিক করুন
লেখা কোডে injection বা authorization-এর ফাঁকনতুন threat নিজেই যুক্ত হয়Threat থেকে পাওয়া negative test চালান
ঝুঁকির স্কোরে অতি আত্মবিশ্বাসঅনুমান তথ্যের মতো দেখায়স্কোরের যুক্তি চান, মানুষ শেষ সিদ্ধান্ত নিন

AI-কে নিজের সিস্টেমের প্রতিরক্ষার কাজে ব্যবহার করুন। Secret, আসল key, গ্রাহকের তথ্য বা প্রকৃত ঠিকানা prompt-এ দেবেন না। নিচের কাঠামোটি কাল্পনিক নাম দিয়ে ভরুন:

আমি নিজের প্রতিষ্ঠানের একটি সিস্টেমের threat model রিভিউ করছি। নিচে DFD-র বিবরণ আছে; কোনো আসল নাম বা secret নেই। [উপাদান, data flow, trust boundary আর অনুমান এখানে লিখুন] ১. প্রতিটি trust boundary পেরোনো flow-এর জন্য STRIDE ধরে আমার তালিকায় বাদ পড়া threat বলো, ধারণার স্তরে, কোনো আক্রমণের ধাপ ছাড়া। ২. প্রতিটির জন্য একটি প্রতিরক্ষা, একটি detection সংকেত আর একটি negative test-এর ধারণা দাও, যা শুধু আমার test পরিবেশে চলবে। ৩. আমার কোন অনুমানগুলো সবচেয়ে দুর্বল, তা বলো। ৪. কোনো standard উল্লেখ করলে তার নাম ও সংস্করণ দাও, আর যেটিতে নিশ্চিত নও সেটি স্পষ্ট করে বলো। কোনো CVE নম্বর বানিয়ো না।

AI-এর threat model হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

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

প্র ০১১৯৯৯ সালের একটি ছয় অক্ষরের সংক্ষিপ্ত নাম আজও কেন টিকে আছে, আর এর সীমা কোথায়?

STRIDE-এর জন্ম ১৯৯৯ সালের এপ্রিলে, Kohnfelder আর Garg-এর “The Threats to Our Products” লেখায়। তখন Microsoft-এর পণ্যগুলো দ্রুত internet-এ যুক্ত হচ্ছিল, আর দলগুলোর দরকার ছিল ঝুঁকি নিয়ে কথা বলার সাধারণ ভাষা। উদ্দেশ্য ছিল সহজ: মনে রাখা যায় এমন একটি শব্দ, যা দিয়ে ডিজাইনাররা নিজেরাই প্রশ্ন করতে পারবেন, বড় বিশেষজ্ঞ ছাড়াই।

টিকে থাকার কারণ তিনটি। প্রথমত, এটি নির্দিষ্ট প্রযুক্তির ওপর নির্ভর করে না। ২০ বছর আগের ডেস্কটপ সফটওয়্যারে যেমন, আজকের API বা cloud-এও “এ কি সত্যিই সে?” একই প্রশ্ন। কোনো নির্দিষ্ট আক্রমণের তালিকা হলে তা পুরোনো হয়ে যেত। দ্বিতীয়ত, এটি নিরাপত্তার মৌলিক গুণগুলোর উল্টো পিঠ, তাই ধারণাগতভাবে পরিষ্কার। তৃতীয়ত, ২০০০-এর দশকের মাঝামাঝি STRIDE-per-element-এর মতো সংযোজন একে DFD-র সাথে জুড়ে কাজের পদ্ধতি বানায়।

তবে সীমাও স্পষ্ট। এটি ঝুঁকি সাজায় না; শুধু খুঁজতে সাহায্য করে। Privacy-র অনেক ক্ষতি, যেমন আলাদা ডেটা জুড়ে মানুষ চিনে ফেলা, এতে ভালোভাবে ধরা পড়ে না, তাই LINDDUN এসেছে। ব্যবসার নিয়মের ফাঁক, supply chain, বা AI-র মতো নতুন ব্যবস্থার ঝুঁকি শুধু ছয়টি অক্ষর দিয়ে স্বাভাবিকভাবে উঠে আসে না। আর চেকলিস্ট ভরলেই নিশ্চিন্ত হওয়ার ঝুঁকি থাকে, যদিও কেউ কঠিন প্রশ্নটি ভাবেননি।

মূল উপলব্ধি: ভালো চিন্তার হাতিয়ার টিকে থাকে কারণ সেটি প্রশ্ন শেখায়, উত্তর মুখস্থ করায় না। STRIDE শুরু করার পথ, শেষ সীমা নয়।

প্র ০২DREAD-এর গল্প থেকে ঝুঁকির স্কোরিং সম্পর্কে কী শেখার আছে? সংখ্যা কি বিচারকে নিরপেক্ষ করে?

DREAD-এর আকর্ষণ বোঝা সহজ। পাঁচটি প্রশ্ন, একটি গড়, তারপর একটি সংখ্যা। ব্যস্ত ম্যানেজার সংখ্যা ভালোবাসেন, কারণ তা তর্ক শেষ করে দেয় বলে মনে হয়। কিন্তু সংখ্যার পেছনে ছিল মানুষের অনুমান। Shostack-এর ২০১৮ সালের লেখায় মূল সমস্যাগুলো আসে: রিভিউয়াররা মাঝের স্কোরে একমত হন না, আর “কত সহজে খুঁজে পাওয়া যায়” আজ একরকম, কাল অন্যরকম। বাইরের কেউ ত্রুটি জানালে discoverability-র হিসাব অর্থহীন হয়ে পড়ে, কারণ সেটি তো পাওয়াই গেছে।

এই অভিজ্ঞতা থেকে এল bug bar-এর চিন্তা। সেখানে প্রশ্নটি বদলে যায়। “এই ত্রুটির স্কোর কত?” নয়, বরং “এটি কি আগে থেকে লেখা এই শ্রেণির মধ্যে পড়ে?” আগে থেকে ঠিক করা মানদণ্ডে মতভেদ কমে, আর একই ধরনের ত্রুটি একই আচরণ পায়। তবে Bug bar-এরও দাম আছে: মানদণ্ড লিখতে ও রক্ষণাবেক্ষণ করতে পরিশ্রম লাগে, আর নতুন ধরনের ঝুঁকি কোনো শ্রেণিতে না পড়তেও পারে।

বড় শিক্ষাটি DREAD ছাড়িয়ে যায়। Cox-এর ২০০৮ সালের প্রবন্ধ দেখায়, ক্রমবাচক মান গুণ করে পাওয়া risk matrix-এর ফল কখনো বিভ্রান্তিকর হতে পারে। CVSS-এর স্কোরও নিজে থেকে “কোনটি আগে” বলে না, তাই EPSS আর KEV-এর মতো তথ্য পাশে লাগে, যা পর্ব ৩২-এ দেখবেন। FAIR ঝুঁকিকে টাকার পরিসরে আনার চেষ্টা করে, তবে সেখানেও ইনপুট মানুষের অনুমান, যদিও তা প্রকাশ্য।

মূল উপলব্ধি: সংখ্যা বিচারকে নিরপেক্ষ করে না, শুধু লুকিয়ে ফেলতে পারে। ভালো পদ্ধতি অনুমানগুলো খোলা রাখে, যাতে অন্য কেউ সেগুলো নিয়ে প্রশ্ন করতে পারেন।

প্র ০৩“আক্রমণকারীর মতো ভাবুন” — এই জনপ্রিয় পরামর্শটি কি যথেষ্ট? Threat modeling কে করবেন?

শুনতে দারুণ, কিন্তু কাজে কঠিন। একজন backend developer-কে “আক্রমণকারীর মতো ভাবুন” বলা অনেকটা একজন সাধারণ মানুষকে “দাবা গ্র্যান্ডমাস্টারের মতো ভাবুন” বলার মতো: যে অভিজ্ঞতা নেই, শুধু আদেশে তা আসে না। Shostack-সহ অনেক অনুশীলনকারী তাই আক্রমণকারীর মনস্তত্ত্ব অনুমান করার বদলে সিস্টেম নিয়ে কাঠামোবদ্ধ প্রশ্ন করার পক্ষে। আপনি নিজের সিস্টেম সবচেয়ে ভালো জানেন, আক্রমণকারীর মন নয়।

আরেকটি বিপদের নাম Manifesto দিয়েছে “hero threat modeler”: একজন বিশেষ প্রতিভাধর মানুষই সব করবেন, এই ধারণা। এতে দুটি ক্ষতি। সেই মানুষটি চলে গেলে দক্ষতাও যায়। আর একজনের দৃষ্টিতে সব ধরা পড়ে না। Manifesto বরং বিভিন্ন দৃষ্টিভঙ্গি আর “informed creativity”-র কথা বলে। ধরুন, কাল্পনিক বাজারে refund-এর ফাঁকটি developer না-ও জানতে পারেন, কিন্তু support কর্মী জানেন কোন গ্রাহক কীভাবে অভিযোগ করেন। Operations-এর মানুষ জানেন backup কোথায় থাকে। হিসাব বিভাগ জানে কোন লেনদেন মেলে না।

দলের জন্য কাজটি মজারও করা যায়। Microsoft ২০১০ সালের দিকে “Elevation of Privilege” নামে একটি কার্ড গেম প্রকাশ করে, যা Shostack-এর তৈরি। সেখানে তাস ধরে ধরে নিজের নকশায় threat খুঁজতে হয়, ফলে নতুন developer-ও প্রশ্ন করতে সাহস পান। এতে চর্চাটি গণতান্ত্রিক হয়। নিরাপত্তা দলের ভূমিকা তখন সব করে দেওয়া নয়, বরং শেখানো, সাহায্য করা আর মান দেখা।

মূল উপলব্ধি: ভালো threat modeling প্রতিভার ওপর নয়, পদ্ধতি আর বৈচিত্র্যের ওপর নির্ভর করে। যিনি সিস্টেম বানান, তিনিই সবচেয়ে ভালো প্রশ্নকর্তা হতে পারেন, যদি হাতে কাঠামো থাকে।

প্র ০৪নকশার ত্রুটি আর কোডের বাগের পার্থক্য কেন গুরুত্বপূর্ণ? Scanner কি threat modeling-এর জায়গা নিতে পারে?

বাগ হলো নিয়ম ঠিক, লেখায় ভুল। নকশার ত্রুটি হলো নিয়মটিই নেই। ধরুন, কাল্পনিক বাজারের কোডে client-এর পাঠানো দাম নিখুঁত, পরিষ্কার কোডে database-এ লেখা হচ্ছে। Scanner কোনো ত্রুটি দেখবে না, কারণ কোনো অনিরাপদ ফাংশন নেই। সমস্যা হলো কেউ সিদ্ধান্তই নেননি যে দাম server থেকে আসবে। Scanner আপনার ব্যবসার নিয়ম জানে না, তাই “এটি কি হওয়ার কথা?” প্রশ্নটি তার পক্ষে সাধারণত করা সম্ভব নয়।

ইতিহাসেও এই পার্থক্যের স্বীকৃতি আছে। ২০০২ সালের জানুয়ারিতে Bill Gates-এর “Trustworthy Computing” memo-র পরে Microsoft-এর Security Development Lifecycle গড়ে ওঠে, যেখানে নকশা-পর্যায়ের threat modeling একটি প্রধান অংশ। ২০১৪ সালে IEEE-র Center for Secure Design বাগের বাইরে নকশার ত্রুটিগুলোর ওপর জোর দিয়ে একটি প্রতিবেদন প্রকাশ করে। আর OWASP Top 10-এর ২০২১ সংস্করণে “Insecure Design” নামে আলাদা শ্রেণি আসে, যেখানে স্পষ্ট বলা হয়, নিখুঁত বাস্তবায়ন দিয়ে খারাপ নকশা সারে না।

আরেকটি কারণ খরচ। নকশার সিদ্ধান্ত অনেক জায়গায় ছড়িয়ে পড়ে। হোয়াইটবোর্ডে একটি তীর বদলানো সহজ, কিন্তু চালু সিস্টেমে trust boundary সরানো মানে API, database আর চুক্তি বদলানো। তবে উল্টো ভুলও আছে: threat modeling-ও scanner-এর জায়গা নিতে পারে না। পুরোনো library-র ত্রুটি বা একটি ভুল config মানুষের বৈঠকে ধরা পড়বে না। পর্ব ৪৯-এ দেখবেন SAST, DAST আর fuzzing কীভাবে সেই ফাঁক ভরে।

মূল উপলব্ধি: Scanner জিজ্ঞেস করে “কোডে কি জানা ভুল আছে?” Threat model জিজ্ঞেস করে “আমরা কি ঠিক জিনিসটি বানাচ্ছি?” দুটিই লাগে, একটি দিয়ে অন্যটি চলে না।

প্র ০৫SolarWinds আর xz-এর ঘটনা trust boundary নিয়ে আমাদের ধারণাকে কীভাবে বদলায়?

আমাদের ছবিতে সীমানা আঁকা হয় বাইরের আর ভেতরের মাঝে। প্রকাশিত প্রতিবেদন অনুযায়ী, ২০২০ সালের SolarWinds ঘটনায় একটি পণ্যের build প্রক্রিয়া আক্রান্ত হয়, ফলে ক্ষতিকর কোড সফটওয়্যারের সাধারণ আপডেটের সাথে, বৈধভাবে স্বাক্ষরিত হয়ে, গ্রাহকদের কাছে পৌঁছায়। ২০২৪ সালে Linux-এর বহুল ব্যবহৃত xz library-র build-এর ভেতরে একটি backdoor ধরা পড়ে। একজন প্রকৌশলী SSH লগইনের সামান্য ধীরগতি খেয়াল করেছিলেন বলে এটি বড় বিপর্যয়ের আগেই বেরিয়ে আসে। প্রতিবেদনগুলো ইঙ্গিত করে, এর পেছনে দীর্ঘদিন ধরে তৈরি করা বিশ্বাসের সম্পর্ক ছিল।

দুটি ঘটনার শিক্ষা একই: যাকে “ভেতরের” ধরা হচ্ছিল, সে-ই আসলে সীমানার বাইরে থাকতে পারে। স্বাক্ষর প্রমাণ করে কে পাঠিয়েছে, জিনিসটি ভালো কি না তা নয়। তাই আধুনিক threat model-এ build server, CI pipeline, package registry আর open source dependency-কে আলাদা উপাদান হিসেবে আঁকা উচিত। Dependency হলো external entity, যার কোড আপনার process-এর ভেতরে চলে। এটি অদ্ভুত, কিন্তু সত্যি।

রক্ষকের জন্য প্রশ্নগুলো বদলে যায়। আমাদের build কে বদলাতে পারে? Artifact-এর উৎস প্রমাণ করা যায়? কোন dependency-র কোন অধিকার আছে? SBOM, signing আর SLSA-র মতো ধারণা এখান থেকেই গুরুত্ব পায়, যা পর্ব ৪৮-এ আসবে। আর কিছু ঝুঁকি আগে থেকে ঠেকানো যায় না, তাই “ধরা পড়লে কীভাবে জানব, কীভাবে সরাব” প্রশ্নও মডেলে থাকতে হবে। xz-এর ঘটনায় শেষ রক্ষা এসেছিল একজন মানুষের কৌতূহল থেকে, কোনো tool থেকে নয়।

মূল উপলব্ধি: বিশ্বাস কোনো স্থায়ী গুণ নয়, একটি অনুমান। Threat model-এর কাজ সেই অনুমান লিখে রাখা, যাতে সেটি ভাঙলে কী হবে তা আগেই ভাবা থাকে।

অনুশীলন

খাতা-কলম নিন। প্রথমটি হিসাব, দ্বিতীয়টি আউটপুট অনুমান, পরের দুটি নকশা আর সমালোচনা।

  1. হিসাব করুন: একটি DFD-তে আছে ২টি external entity, ৩টি process, ২টি data store (একটি log) আর ৬টি data flow. (ক) STRIDE-per-element ছকে মোট কতটি প্রশ্ন? (খ) একটি threat-এর L = ৩, I = ৪; প্রতিরক্ষার পরে L = ১, I = ৪; খরচ ২ person-day. ঝুঁকি, residual risk আর প্রতি person-day-তে ঝুঁকি কমা কত?

    (ক) External: ২ × ২ = ৪। Process: ৩ × ৬ = ১৮। সাধারণ store: ৩, log store: ৪। Flow: ৬ × ৩ = ১৮। মোট ৪ + ১৮ + ৩ + ৪ + ১৮ = ৪৭।

    (খ) ঝুঁকি ৩ × ৪ = ১২। Residual ১ × ৪ = ৪। প্রতি person-day-তে (১২ − ৪) ÷ ২ = ৪। লক্ষ করুন, likelihood কমেছে কিন্তু impact একই, কারণ ঘটলে ক্ষতি একই থাকে।

  2. আউটপুট অনুমান করুন: stride-per-element.js-এ el-এর ভেতরে যোগ করা হলো payout: { kind: "process", zone: "app" }, আর flows-এ যোগ হলো ["F8", "orders", "payout"], ["F9", "payout", "gateway"],. শেষ দুই লাইনে কী ছাপা হবে? আগে হিসাব করুন, তারপর চালিয়ে মেলান।

    নতুন process যোগ করে ৬, দুটি flow যোগ করে ৩ + ৩ = ৬। মোট ৪৬ + ১২ = ৫৮। F8 একই zone-এ, তাই সীমানার হিসাবে যোগ হয় না। F9 app থেকে partner-এ যায়, তাই ১৮ + ৩ = ২১।

    Threat questions to ask: 58
    Of these on boundary-crossing flows: 21
  3. সমালোচনা করুন: একটি দলের threat model-এ আছে একটি ছবি, যেখানে “Web server” আর “Database” দুটি বাক্স; একটি লাইন: “হ্যাকার ঢুকতে পারে, ঝুঁকি ৭.৪”; সমাধান: “firewall লাগাতে হবে”। ছবিটি এক বছর আগের। কমপক্ষে পাঁচটি সমস্যা বলুন, আর কীভাবে ঠিক করবেন।
    • ছবিতে বাইরের পক্ষ, data flow আর trust boundary নেই। DFD আবার আঁকতে হবে।
    • Threat-টি অস্পষ্ট: কে, কী, কোন পথে, কোন সম্পদ, কিছুই নেই। কাঠামোবদ্ধ threat statement লাগবে।
    • ৭.৪ কোন পদ্ধতিতে, কে দিল, জানা নেই। অনুমান আর মাপ লিখতে হবে।
    • “Firewall” threat-এর সাথে মেলানো নয়; আসল সমস্যা authorization হলে firewall কিছুই করবে না।
    • কোনো মালিক, test বা backlog item নেই, তাই কাজ হবে না।
    • ছবি পুরোনো। পরিবর্তনের সাথে হালনাগাদের নিয়ম লাগবে।
  4. নকশা করুন: একটি কাল্পনিক ইউটিলিটি অ্যাপ মোবাইল ওয়ালেট দিয়ে বিদ্যুৎ বিল জমা নেবে। চারটি প্রশ্ন ধরে এগোন: DFD আঁকুন, trust boundary দাগান, সীমানা পেরোনো একটি flow-তে STRIDE চালান, আর একটি threat থেকে একটি test ও একটি backlog item লিখুন।

    একটি নমুনা উত্তর: External: গ্রাহক, ওয়ালেট কোম্পানি, বিদ্যুৎ বিতরণ সংস্থার সার্ভার। Process: Bill API, Payment handler. Store: Bills DB, Audit log. Boundary: internet, দুই বাইরের partner, app zone, data zone.

    ওয়ালেটের “paid” বার্তার flow-তে S: স্বাক্ষর যাচাই; T: বিলের পরিমাণ মেলানো; R: event id রাখা; I: গ্রাহক নম্বর মাস্ক; D: queue; E: handler-এর সীমিত অধিকার।

    Threat: একই “paid” বার্তা দুবার এলে দুবার জমা দেখায়। Test: নিজের test পরিবেশে একই event id দুবার দিলে bill-এ একটিই জমা থাকে। Backlog: “Payment handler-এ idempotency”, মালিক payment দল, done when সেই test CI-তে সবুজ। আপনার DFD আলাদা হতে পারে; উপাদানগুলো যুক্তিসঙ্গত আর সব threat-এর সিদ্ধান্ত থাকলেই চলবে।

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

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

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

  1. সিস্টেমের DFD আঁকা
  2. Trust boundary দাগানো
  3. STRIDE ধরে threat খোঁজা
  4. Likelihood × impact দিয়ে ঝুঁকি সাজানো
  5. Mitigation-কে test আর backlog item-এ বদলানো
  6. Test চালিয়ে যাচাই আর মডেল হালনাগাদ

STRIDE-এর “T” (Tampering) সরাসরি কোন নিরাপত্তা-গুণ ভাঙে?

  • Confidentiality
  • Integrity
  • Availability
  • Authorization

Data flow diagram-এ trust boundary বলতে কী বোঝায়?

  • দুটি data center-এর ভৌগোলিক দূরত্ব
  • কোডের প্রতিটি function-এর শুরু আর শেষ
  • যেখানে বিশ্বাসের মাত্রা বদলায়, এমন রেখা
  • Firewall-এর নিয়মের তালিকা

একটি attack tree-এর মূল OR ডাল, যার তিনটি পথের ধরে নেওয়া প্রচেষ্টা ৩, ৬ আর ৮. রক্ষক ৮-এর পথটিকে ১২ করলেন। মূলের মান কত?

  • ৩
  • ৬
  • ১২
  • ২১

দুজন রিভিউয়ার একই threat-এর DREAD গড় দিলেন ৭.৮ আর ৬.৬; মতভেদ শুধু discoverability-তে। এটি কোন সমালোচনার সবচেয়ে ভালো উদাহরণ?

  • গড় নেওয়ার গাণিতিক ভুল
  • DREAD অনেক ধীর একটি পদ্ধতি
  • DREAD শুধু availability মাপে
  • স্কোর বিষয়নির্ভর, তাই ফল মানুষভেদে বদলায়

একটি threat-এর likelihood ৪, impact ৫. প্রতিরক্ষার পরে likelihood ১, impact একই, খরচ ৩ person-day. প্রতি person-day-তে ঝুঁকি কত কমল?

  • ৩
  • ৫
  • ১৫
  • ২০

নিচের কোন threat statement সবচেয়ে কাজের?

  • “হ্যাকার সিস্টেমে ঢুকতে পারে”
  • “আমাদের WAF দরকার”
  • “বার্তার উৎস যাচাই না হওয়ায় যে কেউ জাল paid বার্তা পাঠিয়ে টাকা ছাড়া পণ্য বের করতে পারে”
  • “ঝুঁকি ৭.৪, উঁচু”

শব্দকোষ

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

মনে রাখুন

  1. Threat modeling-এর চারটি প্রশ্ন: কী নিয়ে কাজ করছি, কী ভুল হতে পারে, কী করব, কাজটি ভালো হলো কি না।
  2. DFD আর trust boundary আগে; সীমানা পেরোনো তীরে প্রমাণ ছাড়া কিছু মানবেন না।
  3. STRIDE ছয়টি গুণের উল্টো: authentication, integrity, non-repudiation, confidentiality, availability, authorization.
  4. Attack surface ছোট করাই সস্তা প্রতিরক্ষা; attack tree দেখায় সবচেয়ে দুর্বল ডাল কোনটি।
  5. Likelihood × impact দিয়ে আলোচনা শুরু করুন; শেষ ফল হোক মালিকসহ test আর backlog item.

পরের পর্বে: Threat model দেখায় আপনার সিস্টেমে কী ভুল হতে পারে। এবার দেখব বাস্তব হামলা সাধারণত কোন ধাপে এগোয়, আর রক্ষক cyber kill chain ও MITRE ATT&CK-কে কীভাবে কাজে লাগান।

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

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