Spring Boot ও জাভা অ্যাপ্লিকেশনে কমান্ড ইনজেকশন প্রতিরোধের সেরা উপায়

এক নজরে টেকনিক্যাল সারসংক্ষেপ (Quick Technical Summary): মূল ধারণা: Runtime.getRuntime().exec() এ স্ট্রিং যোগ করে কমান্ড চালাবেন না।

Spring Boot ও জাভা অ্যাপ্লিকেশনে কমান্ড ইনজেকশন প্রতিরোধের সেরা উপায়

[!TIP] এক নজরে টেকনিক্যাল সারসংক্ষেপ (Quick Technical Summary):

  • মূল ধারণা: Runtime.getRuntime().exec() এ স্ট্রিং যোগ করে কমান্ড চালাবেন না। ProcessBuilder ব্যবহার করে আলাদা আর্গুমেন্ট পাস করুন এবং ইনপুট ফিল্টারিং নিশ্চিত করুন।
  • প্রতিরোধের উপায়: কঠোর ইনপুট ভ্যালিডেশন নিশ্চিত করা, অপ্রয়োজনীয় শেল/ইভাল বন্ধ রাখা এবং সর্বনিম্ন অধিকার নীতি মেনে চলা।
  • ভেরিফিকেশন: অ্যাপ্লিকেশন লগ নিয়মিত মনিটর করা এবং স্বয়ংক্রিয় রিগ্রেশন টেস্ট রান করা।

আধুনিক সফটওয়্যার ইঞ্জিনিয়ারিংয়ে সিকিউরিটি নিশ্চিত করতে কোড এবং আর্কিটেকচার উভয় স্তরেই সতর্ক থাকা অত্যন্ত জরুরি।

ক্যারিয়ারের অগ্রগতির পাশাপাশি ডেভেলপারদের আন্তর্জাতিক ক্যারিয়ার গাইডলাইন জানতে পড়ে দেখতে পারেন বাংলাদেশি ডেভেলপারদের জন্য হাই-পেয়িং রিমোট জব গাইড।

টেকনিক্যাল বিশ্লেষণ এবং মূল কারণ

যখন ব্যবহারকারীর কাছ থেকে পাওয়া ইনপুট যাচাই ছাড়া সরাসরি সার্ভারের ইন্টারনাল রিসোর্স বা অপারেটিং সিস্টেমে যায়, তখন এই সিকিউরিটি ঝুঁকি তৈরি হয়:

Client Input ===> Web Handler ===> [Unvalidated Parameter] ===> Internal Resource / OS / Network

নিরাপদ আর্কিটেকচার নিশ্চিত করতে নিচের টেস্টেড রেফারেন্স কোডটি অনুসরণ করুন:

// Spring Boot Controller - Secure ProcessBuilder
package com.newsreport.security;

import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.regex.Pattern;

@RestController
public class ToolController {
    private static final Pattern SAFE_PATTERN = Pattern.compile("^[a-zA-Z0-9.-]+$");

    @PostMapping("/dns-lookup")
    public String lookupDomain(@RequestParam String domain) throws IOException, InterruptedException {
        if (!SAFE_PATTERN.matcher(domain).matches()) {
            throw new IllegalArgumentException("Disallowed input format");
        }

        // ProcessBuilder does not execute a shell, preventing injection
        ProcessBuilder pb = new ProcessBuilder("nslookup", domain);
        Process process = pb.start();
        return new String(process.getInputStream().readAllBytes());
    }
}

ডিফেন্সিভ কোডিং চেকলিস্ট

১. ইনপুট নরমালাইজেশন: পাথ বা ইউআরএল যাচাই করার পূর্বে ইনপুটকে অবশ্যই নরমালাইজ করে নিন। ২. হোয়াইটলিস্ট চেকিং: ব্লকলিস্টের ওপর নির্ভর না করে শুধু অনুমোদিত ক্যারেক্টার বা ডোমেনের হোয়াইটলিস্ট ব্যবহার করুন। ৩. শেল এক্সিকিউশন পরিহার: শেলের মাধ্যমে কমান্ড না চালিয়ে সরাসরি বাইনারি এক্সিকিউট করুন। ৪. লিস্ট প্রিভিলেজ (Least Privilege): কন্টেইনার এবং সার্ভিসগুলোকে নন-রুট ইউজার হিসেবে রান করুন।

সাধারণ ভুল ধারণা যা এড়িয়ে চলা উচিত

  • শুধুমাত্র ডাব্লুএএফ (WAF)-এর ওপর নির্ভর করা এবং সোর্স কোডের বাগ ঠিক না করা।
  • ডাবল-এনকোডিং বা ইউনিকোড টেকনিকের মাধ্যমে সহজ রেজেক্স ফিল্টার বাইপাস করা সম্ভব তা ভুলে যাওয়া।

লগ মনিটরিং ও অ্যালার্টিং

ওয়েব সার্ভার ও অ্যাক্সেস লগে কোনো সন্দেহজনক এনকোডেড প্যারামিটার বা অস্বাভাবিক এরর কোড (যেমন ঘনঘন 403 Forbidden) এলে তাৎক্ষণিক অ্যালার্ট সেট করুন।

উপসংহার

নেটওয়ার্ক, রানটাইম এবং অ্যাপ্লিকেশন কোড—প্রতিটি স্তরেই ডিফেন্স-ইন-ডেপথ নিশ্চিত করুন।

আরও পড়ুন

কমান্ড ইনজেকশন কী: অপারেটিং সিস্টেম কমান্ড এক্সিকিউশন ও সুরক্ষার উপায়

ইউজার ইনপুট সরাসরি সিস্টেম শেলে (sh, bash) চলে গেলে কমান্ড ইনজেকশন ঘটে। শেলের বদলে আর্গুমেন্ট অ্যারে ব্যবহারকারী execFile চালানোই এর স্থায়ী সমাধান।

Vulnerabilities•২ মিনিটে পড়া

পাথ ট্রাভার্সাল কী: ডট-ডট-স্ল্যাশ ভালনারেবিলিটি কীভাবে কাজ করে ও প্রতিরোধের উপায়

এক নজরে টেকনিক্যাল সারসংক্ষেপ (Quick Technical Summary): মূল ধারণা: পাথ ট্রাভার্সাল হলো এমন একটি ত্রুটি যার মাধ্যমে আক্রমণকারী ../ সিকোয়েন্স ব্যবহার করে সার্ভারের গোপন ফাইল পড়ে ফেলতে পারে।

Vulnerabilities•২ মিনিটে পড়া

Node.js এবং Express অ্যাপ্লিকেশনে পাথ ট্রাভার্সাল প্রতিরোধের সঠিক নিয়ম

কখনোই req.params বা req.query সরাসরি res.sendFile-এ দেবেন না। path.resolve এবং startsWith দিয়ে নির্দিষ্ট ডিরেক্টরি লক করে ফাইল সার্ভ করুন।

Security•২ মিনিটে পড়া