পাঠ ২৯ · ৫৭-এর মধ্যে · মডিউল ৭
Home / Courses / Ethics in Computing & AI Safety / সাইবারসিকিউরিটি এথিক্স

এথিক্যাল হ্যাকিং ও রেসপন্সিবল ডিসক্লোজার

Ethical hacking & responsible disclosure
৮ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • এথিক্যাল হ্যাকিং ম্যালিশাস হ্যাকিং থেকে ঠিক কীভাবে আলাদা
  • রেসপন্সিবল/কোঅর্ডিনেটেড ডিসক্লোজারের চারটি ধাপ ও এর পেছনের যুক্তি
  • ফুল ডিসক্লোজার ও নন-ডিসক্লোজার — দুটি চরম অবস্থানের ঝুঁকি
  • Python দিয়ে একটি সত্যিকারের ডিসক্লোজার-টাইমলাইন স্টেট মেশিন ও পলিসি-চেক ফাংশন — একাধিক দৃশ্যকল্পে যাচাই করা

১ · এথিক্যাল হ্যাকিং কী

এথিক্যাল হ্যাকিংEthical Hackingমালিকের সুস্পষ্ট অনুমতি নিয়ে একটি সিস্টেমের দুর্বলতা খুঁজে বের করা, যাতে সেটি ঠিক করা যায় — আক্রমণের জন্য নয়, রক্ষার জন্য। হলো একই টেকনিক্যাল দক্ষতা — নেটওয়ার্ক স্ক্যানিং, কোড রিভিউ, পেনিট্রেশন টেস্টিং — কিন্তু অনুমতি নিয়ে এবং প্রকাশের একটি সৎ উদ্দেশ্য নিয়ে প্রয়োগ করা। ঠিক এই দুটো উপাদানই — অনুমতি ও উদ্দেশ্য — একটি কাজকে অপরাধ থেকে একটি সুরক্ষামূলক সেবায় রূপান্তরিত করে। এই কোর্সের ফোকাস টেকনিক্যাল পদ্ধতি নয় (তার জন্য Cybersecurity & Ethical Hacking কোর্সে হোয়াইট-হ্যাট/গ্রে-হ্যাট/ ব্ল্যাক-হ্যাটের স্পেকট্রাম ও কৌশল বিস্তারিত আছে) — বরং একজন গবেষক দুর্বলতা খুঁজে পাওয়ার পর কী করেন তার নৈতিক ও প্রাতিষ্ঠানিক দিকটি।

বাগ বাউন্টি প্রোগ্রাম

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

২ · রেসপন্সিবল ডিসক্লোজারের নর্ম

একটি দুর্বলতা খুঁজে পাওয়ার পর গবেষকের সামনে মূলত তিনটি পথ থাকে। নন-ডিসক্লোজার (কখনো প্রকাশ না করে বসে থাকা, বা আরও খারাপ, গোপনে তৃতীয় পক্ষের কাছে বিক্রি করে দেওয়া) ব্যবহারকারীদের অনির্দিষ্টকালের জন্য ঝুঁকিতে ফেলে রাখে। ফুল/তাৎক্ষণিক ডিসক্লোজার (ভেন্ডরকে কোনো সময় না দিয়েই সব বিস্তারিত পাবলিক করে দেওয়া) ভেন্ডরকে দ্রুত পদক্ষেপ নিতে বাধ্য করতে পারে, কিন্তু ফিক্স তৈরির আগেই আক্রমণকারীদের হাতে একটি কার্যকর "কীভাবে আক্রমণ করবেন"-এর ম্যানুয়াল তুলে দেয়। মাঝের পথ — রেসপন্সিবল/কোঅর্ডিনেটেড ডিসক্লোজারCoordinated Disclosureভেন্ডরকে প্রথমে প্রাইভেটলি জানানো, একটি যুক্তিসঙ্গত ফিক্স-উইন্ডো দেওয়া, তারপর প্রকাশ করা। — বর্তমানে পেশাদার নিরাপত্তা সম্প্রদায়ে সবচেয়ে ব্যাপকভাবে গৃহীত নর্ম।

reported ভেন্ডরকে প্রাইভেট রিপোর্ট vendor_acknowledged ভেন্ডর স্বীকার করেছে fix_released প্যাচ/ফিক্স প্রকাশিত public disclosure
সাধারণ কোঅর্ডিনেটেড ডিসক্লোজার এই চার ধাপে এগোয় — কিন্তু "সক্রিয় শোষণ" (active exploitation) ধরা পড়লে, নিচের কোড সেলে দেখানো একটি স্বীকৃত ব্যতিক্রম হিসেবে ফিক্সের আগেই পাবলিক ডিসক্লোজারকে ন্যায্য মনে করা হতে পারে।
নন-ডিসক্লোজার
কখনো প্রকাশ না করা বা গোপনে বিক্রি করা — ব্যবহারকারীরা অনির্দিষ্টকালের জন্য অরক্ষিত থেকে যান।
ফুল/তাৎক্ষণিক ডিসক্লোজার
ভেন্ডরকে সময় না দিয়ে সব প্রকাশ — ভেন্ডরকে চাপ দেয় কিন্তু আক্রমণকারীদেরও সুবিধা দেয়।
কোঅর্ডিনেটেড ডিসক্লোজার
প্রাইভেট রিপোর্ট + যুক্তিসঙ্গত ফিক্স-উইন্ডো + তারপর প্রকাশ — বর্তমান পেশাদার নর্ম।

বাস্তবে কোনো একক সর্বজনীন সময়সীমা নেই — বিভিন্ন সংস্থা ও গবেষক ভিন্ন ভিন্ন সময়সীমা উল্লেখ করেন (যেমন কিছু সংস্থা ৪৫ দিনের একটি ক্লাসিক গাইডলাইন ব্যবহার করে অসাড় ভেন্ডরদের জন্য, আবার কিছু বড় গবেষণা দল ৯০ দিনের একটি স্ট্যান্ডার্ড উইন্ডো ব্যবহার করে) — কিন্তু প্রায় সব নর্মেই একটি অভিন্ন নীতি আছে: যদি দুর্বলতাটি ইতিমধ্যে বাস্তবে সক্রিয়ভাবে শোষিত (actively exploited in the wild) হচ্ছে বলে প্রমাণ পাওয়া যায়, তাহলে ব্যবহারকারীদের নিজেদের রক্ষা করার সুযোগ দেওয়ার জন্য সেই উইন্ডো অনেক ছোট করে ফেলা ন্যায্য বলে বিবেচিত হয়।

৩ · একটি ডিসক্লোজার-টাইমলাইন স্টেট মেশিন ও পলিসি-চেক

নিচের কোড সেলে দুটো জিনিস তৈরি করা হয়েছে — একটি সাধারণ স্টেট মেশিন যা টাইমলাইনটিকে শুধু সামনের দিকে এগোতে দেয়, এবং একটি পলিসি-চেক ফাংশন যা সিভিয়ারিটি/সক্রিয় শোষণ/অতিবাহিত সময়ের ভিত্তিতে প্রকৃতপক্ষে গণনা করে বলে দেয় ফিক্সের আগেই পাবলিক ডিসক্লোজার ন্যায্য কি না।

Python
# ইলাস্ট্রেটিভ, সিন্থেটিক দৃশ্যকল্প -- বাস্তব কোনো নির্দিষ্ট প্রতিষ্ঠান বা দুর্বলতা নয়
# রেসপন্সিবল ডিসক্লোজার টাইমলাইনের একটি স্টেট মেশিন + একটি পলিসি-চেক ফাংশন

STATES = ["reported", "vendor_acknowledged", "fix_released", "public_disclosure"]

def advance(history, new_state):
    # টাইমলাইন শুধু সামনের দিকে এগোতে পারে, পিছনে নয়
    current = history[-1]
    if STATES.index(new_state) < STATES.index(current):
        raise ValueError(f"রাষ্ট্র পিছনে যেতে পারে না: {current} -> {new_state}")
    history.append(new_state)
    return history


def is_early_disclosure_justified(active_exploitation_in_wild, vendor_acknowledged,
                                   fix_released, days_since_report,
                                   active_exploit_grace_days=7,
                                   unresponsive_vendor_grace_days=45,
                                   standard_grace_days=90):
    """
    প্রচলিতভাবে উল্লেখিত রেসপন্সিবল-ডিসক্লোজার নর্ম অনুযায়ী, ফিক্স প্রকাশের আগেই
    পাবলিক ডিসক্লোজার ন্যায্য কি না -- তা মূল্যায়ন করে। এটি একটি সরলীকৃত,
    ইলাস্ট্রেটিভ মডেল -- বাস্তব সিদ্ধান্তে আইনি পরামর্শ ও প্রেক্ষাপট-নির্ভর
    বিচার-বিবেচনারও প্রয়োজন হয়।
    """
    if fix_released:
        return True, "ফিক্স ইতিমধ্যে প্রকাশিত -- সম্পূর্ণ প্রকাশ এখন স্বাভাবিক পরবর্তী ধাপ।"

    if active_exploitation_in_wild:
        if days_since_report >= active_exploit_grace_days:
            return True, (f"দুর্বলতাটি বাস্তবে সক্রিয়ভাবে শোষিত হচ্ছে এবং জরুরি "
                           f"{active_exploit_grace_days}-দিনের সমন্বয় উইন্ডো পার হয়েছে -- "
                           f"ব্যবহারকারীদের রক্ষার সুযোগ দেওয়াকে অগ্রাধিকার দেওয়া হয়।")
        else:
            return False, (f"সক্রিয় শোষণ ঘটছে, কিন্তু ন্যূনতম {active_exploit_grace_days}-দিনের "
                            f"জরুরি সমন্বয় উইন্ডো এখনও শেষ হয়নি।")

    if not vendor_acknowledged and days_since_report >= unresponsive_vendor_grace_days:
        return True, (f"ভেন্ডর {unresponsive_vendor_grace_days} দিনেও রিপোর্ট স্বীকার করেনি -- "
                       f"ভেন্ডরের অসাড়তা নিজেই আগাম প্রকাশের একটি স্বীকৃত কারণ।")

    if days_since_report >= standard_grace_days:
        return True, f"স্ট্যান্ডার্ড {standard_grace_days}-দিনের যুক্তিসঙ্গত ফিক্স-উইন্ডো পার হয়ে গেছে।"

    return False, "এখনও প্রচলিত যুক্তিসঙ্গত সময়সীমার মধ্যে আছে -- ভেন্ডরকে আরও সময় দেওয়াই নর্ম।"


# --- স্টেট মেশিনের একটি স্বাভাবিক টাইমলাইন ---
history = ["reported"]
advance(history, "vendor_acknowledged")
advance(history, "fix_released")
advance(history, "public_disclosure")
print("স্বাভাবিক টাইমলাইন:", " -> ".join(history))

try:
    advance(["fix_released"], "reported")
except ValueError as e:
    print(f"অবৈধ পরিবর্তন প্রতিরোধ করা হলো: {e}")

print()

# --- তিনটি কংক্রিট দৃশ্যকল্পে পলিসি-চেক ---
scenarios = [
    {"name": "দৃশ্যকল্প ১: ক্রিটিক্যাল বাগ, সক্রিয় শোষণ, ১০ দিন পার হয়েছে",
     "active_exploitation_in_wild": True, "vendor_acknowledged": True,
     "fix_released": False, "days_since_report": 10},
    {"name": "দৃশ্যকল্প ২: হাই-সেভেরিটি বাগ, ভেন্ডর সাড়া দিচ্ছে, শোষণ নেই, ৩০ দিন পার হয়েছে",
     "active_exploitation_in_wild": False, "vendor_acknowledged": True,
     "fix_released": False, "days_since_report": 30},
    {"name": "দৃশ্যকল্প ৩: ভেন্ডর ৫০ দিনেও কোনো সাড়া দেয়নি, শোষণ নেই",
     "active_exploitation_in_wild": False, "vendor_acknowledged": False,
     "fix_released": False, "days_since_report": 50},
]

for s in scenarios:
    justified, reason = is_early_disclosure_justified(
        s["active_exploitation_in_wild"], s["vendor_acknowledged"],
        s["fix_released"], s["days_since_report"]
    )
    print(s["name"])
    print(f"  আগাম পাবলিক ডিসক্লোজার ন্যায্য?  {'হ্যাঁ' if justified else 'না'}")
    print(f"  কারণ: {reason}\n")

    
লক্ষ্য করুন দৃশ্যকল্প ১-এ সক্রিয় শোষণের কারণে মাত্র ১০ দিনেই আগাম প্রকাশ ন্যায্য হয়ে যায়, দৃশ্যকল্প ২-তে স্বাভাবিক পরিস্থিতিতে ৩০ দিন এখনও যথেষ্ট নয় (৯০-দিনের উইন্ডোর মধ্যে), কিন্তু দৃশ্যকল্প ৩-এ ভেন্ডরের ৫০ দিনের নীরবতা একটি ভিন্ন যুক্তিতে (ভেন্ডরের অসাড়তা) আগাম প্রকাশকে ন্যায্য করে তোলে — তিনটি ভিন্ন পরিস্থিতি, তিনটি ভিন্ন কারণে ভিন্ন সিদ্ধান্ত, কিন্তু একই সামঞ্জস্যপূর্ণ নীতি থেকে গণনা করা।
মূল কথা · Key takeaway

দায়িত্বশীল ডিসক্লোজার একটি প্রক্রিয়া, একটি একক নিয়ম নয় — এটি ভেন্ডরকে ন্যায্য সময় দেওয়া এবং ব্যবহারকারীদের অনির্দিষ্টকালের ঝুঁকিতে না রাখার মধ্যে একটি ভারসাম্য খোঁজে। "সক্রিয় শোষণ" এবং "ভেন্ডরের অসাড়তা"-র মতো ব্যতিক্রম শর্তগুলো দেখায় যে এই ভারসাম্য প্রেক্ষাপট-নির্ভর — একটি স্থির সংখ্যা নয়, বরং প্রকৃত ঝুঁকির প্রতি প্রতিক্রিয়াশীল একটি নীতি।

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

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ "এথিক্যাল হ্যাকিং"-কে সাধারণ ম্যালিশাস হ্যাকিং থেকে ঠিক কী আলাদা করে — টেকনিক্যাল স্কিল, নাকি অন্য কিছু?

টেকনিক্যাল স্কিল প্রায় একই থাকতে পারে — একটি নেটওয়ার্ক স্ক্যান করা বা একটি দুর্বলতা খুঁজে বের করার পদ্ধতি একজন এথিক্যাল হ্যাকার ও একজন আক্রমণকারী উভয়ের জন্য একই রকম হতে পারে। যা আলাদা করে তা হলো অনুমতি (মালিকের সুস্পষ্ট অনুমতি নিয়ে কাজ করা হচ্ছে কিনা) এবং উদ্দেশ্য (আবিষ্কারটি রক্ষার জন্য ব্যবহার করা হবে, নাকি ক্ষতি করার জন্য) — একই দক্ষতা, ভিন্ন প্রেক্ষাপট ও লক্ষ্য।

প্র ০২ কেন অনেকে মনে করেন "তাৎক্ষণিক পূর্ণ পাবলিক ডিসক্লোজার" (ফিক্সের আগেই সব বিস্তারিত প্রকাশ) অনৈতিক, এমনকি যখন উদ্দেশ্য একটি অলস ভেন্ডরকে দ্রুত পদক্ষেপ নিতে বাধ্য করা?

কারণ সেই প্রকাশটি শুধু ভেন্ডরকে নয়, একই সাথে প্রতিটি সম্ভাব্য আক্রমণকারীকেও দুর্বলতাটি কীভাবে ব্যবহার করতে হয় তা জানিয়ে দেয় — অথচ সাধারণ ব্যবহারকারীদের নিজেদের রক্ষা করার কোনো উপায় (একটি ফিক্স) তখনো থাকে না। উদ্দেশ্য যত ভালোই হোক, প্রভাব বাস্তবে ব্যবহারকারীদের ঝুঁকি বাড়িয়ে দেয় — এই কারণেই কোঅর্ডিনেটেড ডিসক্লোজার একটি যুক্তিসঙ্গত ফিক্স-উইন্ডো রাখার পক্ষে যুক্তি দেয়।

প্র ০৩ উপরের কোড সেলের দৃশ্যকল্প ১-এ যদি active_exploitation_in_wild-কে False করা হতো (বাকি সব অপরিবর্তিত, days_since_report = 10), ফলাফল কী হতো এবং কেন?

তাহলে fix_released এখনও False, সক্রিয় শোষণও নেই, ভেন্ডর স্বীকৃতি দিয়েছে (তাই "অসাড়তা" শর্তও প্রযোজ্য নয়), আর ১০ দিন স্ট্যান্ডার্ড ৯০-দিনের উইন্ডোর চেয়ে অনেক কম — তাই ফাংশনটি False, "এখনও প্রচলিত যুক্তিসঙ্গত সময়সীমার মধ্যে আছে..." রিটার্ন করত। সক্রিয় শোষণের ব্যতিক্রম শর্তটিই ছিল দৃশ্যকল্প ১-কে দ্রুত ন্যায্য করার একমাত্র কারণ।

অনুশীলন

  1. চিন্তা করুন: বাগ বাউন্টি প্রোগ্রাম গবেষক ও ভেন্ডরের মধ্যে সম্পর্ককে কীভাবে "অ্যাডহক অনুগ্রহ" থেকে একটি প্রাতিষ্ঠানিক প্রক্রিয়ায় বদলে দেয়? এটি কি সব ধরনের ডিসক্লোজার-সংক্রান্ত দ্বন্দ্ব দূর করে দেয়?

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

  2. পরীক্ষা করুন: উপরের কোড সেলে দৃশ্যকল্প ২-এর days_since_report-কে 30 থেকে 90-এ পরিবর্তন করে Run চেপে দেখুন ফলাফল ও কারণ কীভাবে বদলায়।

    days_since_report = 90 হলে, ফিক্স তখনও প্রকাশিত হয়নি, সক্রিয় শোষণও নেই, ভেন্ডর স্বীকৃতি দিয়েছে (তাই অসাড়তা শর্ত প্রযোজ্য নয়), কিন্তু এবার days_since_report >= standard_grace_days (90) শর্তটি সত্য হয়ে যায় — তাই ফলাফল বদলে যাবে True, "স্ট্যান্ডার্ড ৯০-দিনের যুক্তিসঙ্গত ফিক্স-উইন্ডো পার হয়ে গেছে।"-এ, দেখাচ্ছে যে সময়ই এখানে নির্ণায়ক কারণ হয়ে দাঁড়ায়।

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

আগের পাঠ
টেস্টিং, ভেরিফিকেশন ও নিশ্চয়তার সীমাবদ্ধতা