মোবাইল অ্যাপ সিকিউরিটি — Android/iOS বেসিকস
এই পাঠে যা শিখবেন
- ওয়েব সিকিউরিটি থেকে মোবাইল অ্যাপ সিকিউরিটি কীভাবে আলাদা — চারটি মূল ঝুঁকি ক্যাটাগরি
- ইনসিকিউর লোকাল স্টোরেজ ও এক্সপোজড IPC কম্পোনেন্ট কী এবং কেন বিপজ্জনক
- সার্টিফিকেট পিনিং কীভাবে ডিভাইস-লেভেল MITM-কেও প্রতিরোধ করে (L37-এর PKI ট্রাস্ট চেইনের বাইরেও)
- Android/iOS-এর স্যান্ডবক্সিং ও পারমিশন-গেট মডেল, এবং একটি সাধারণ অতিরিক্ত-পারমিশন অডিটর তৈরি
১ · মোবাইল অ্যাপ সিকিউরিটি কেন ওয়েব থেকে আলাদা
এতদিন আমরা M5-এ ওয়েব অ্যাপ্লিকেশনের ঝুঁকি (OWASP Top 10) নিয়ে কাজ করেছি — যেখানে আক্রমণকারীর মূল লক্ষ্য থাকে সার্ভার ও নেটওয়ার্কে। মোবাইল অ্যাপে আক্রমণের পৃষ্ঠতল ভিন্ন, কারণ কোডটি এখন সরাসরি ব্যবহারকারীর ডিভাইসে চলে — একজন আক্রমণকারী যদি ডিভাইসেই অ্যাক্সেস পায় (হারানো ফোন, রুটেড/জেইলব্রোকেন ডিভাইস, বা ইনস্টল করা ম্যালওয়্যার), তাহলে অ্যাপের নিজস্ব দুর্বলতাগুলো সরাসরি কাজে লাগানো যায়।
সংবেদনশীল ডেটা (টোকেন, পাসওয়ার্ড) ডিভাইসে আনএনক্রিপ্টেড অবস্থায় ক্যাশ করা থাকলে, ডিভাইস কম্প্রোমাইজড হলে সহজেই পড়া যায়।
অ্যাপের এক্সপোজড কম্পোনেন্ট (activity/service/broadcast receiver) অন্য যেকোনো অ্যাপ থেকে সরাসরি কল করা যেতে পারে যদি সঠিকভাবে সুরক্ষিত না থাকে।
অ্যাপ ডিভাইসের ডিফল্ট CA ট্রাস্ট মেনে চলে — একটি রোগ (rogue) CA ইনস্টল থাকলে HTTPS হলেও MITM সম্ভব।
একটি অ্যাপ তার কাজের সাথে অসামঞ্জস্যপূর্ণ পারমিশন চাইলে (যেমন ফ্ল্যাশলাইট অ্যাপ কন্ট্যাক্টস চায়) সেটি একটি লাল পতাকা।
২ · ইনসিকিউর লোকাল স্টোরেজ ও ইন্টার-প্রসেস কমিউনিকেশন (IPC)
অনেক অ্যাপ পারফরম্যান্সের জন্য ডেটা লোকালি ক্যাশ করে — সমস্যা তখন হয় যখন সেই ক্যাশে সংবেদনশীল তথ্য (যেমন login token, ব্যক্তিগত মেসেজ, ক্রেডিট কার্ডের আংশিক তথ্য) প্লেইনটেক্সটে সংরক্ষিত থাকে। একটি রুটেড Android বা জেইলব্রোকেন iOS ডিভাইসে (বা ব্যাকআপ ফাইল অ্যাক্সেসের মাধ্যমে), এই ফাইলগুলো সরাসরি পড়া সম্ভব হতে পারে।
IPC (Inter-Process Communication)IPCএকই ডিভাইসে চলা দুটি ভিন্ন প্রসেস/অ্যাপের মধ্যে ডেটা আদান-প্রদানের প্রক্রিয়া। Android-এ Activity, Service, Broadcast Receiver, Content Provider — এই চারটি কম্পোনেন্ট যদি ভুলবশত exported=true হিসেবে চিহ্নিত থাকে, তাহলে ডিভাইসের যেকোনো অ্যাপ সেগুলো সরাসরি কল করতে পারে।
হলো একই ডিভাইসে থাকা দুটি অ্যাপের মধ্যে যোগাযোগের প্রক্রিয়া। যদি একটি অ্যাপের সংবেদনশীল কম্পোনেন্ট (যেমন
"ব্যালেন্স ট্রান্সফার" করার একটি সার্ভিস) ভুলবশত অন্য যেকোনো অ্যাপ থেকে কল করার জন্য উন্মুক্ত (exported) রেখে
দেওয়া হয়, তাহলে ডিভাইসে ইনস্টল করা একটি ক্ষতিকর অ্যাপ সরাসরি সেই কম্পোনেন্ট কল করে অনিচ্ছাকৃত কাজ ঘটাতে পারে —
ব্যবহারকারীর কোনো ইন্টারঅ্যাকশন ছাড়াই।
সংবেদনশীল ডেটা সবসময় প্ল্যাটফর্মের নিরাপদ স্টোরেজে রাখুন (Android Keystore, iOS Keychain) — কখনো সাধারণ প্লেইনটেক্সট ফাইল/প্রেফারেন্সে নয়। কম্পোনেন্ট শুধুমাত্র প্রয়োজনে exported করুন, এবং exported হলেও IPC-এর মাধ্যমে আসা ইনপুট ঠিক তেমনি যাচাই করুন যেমন একটি নেটওয়ার্ক রিকোয়েস্টের ইনপুট যাচাই করতেন (কখনো বিশ্বাস করবেন না যে কল করা অ্যাপটি বৈধ, শুধু কারণ এটি একই ডিভাইসে আছে)।
৩ · সার্টিফিকেট পিনিং — TLS ট্রাস্টের উপর একটি অতিরিক্ত স্তর
L37-এ আমরা দেখেছি একটি ব্রাউজার/OS কীভাবে একটি সার্টিফিকেটের ট্রাস্ট চেইন যাচাই করে — ডিভাইসে বিল্ট-ইন থাকা যেকোনো রুট CA-এর মাধ্যমে সাইন করা সার্টিফিকেটকে বিশ্বাস করা হয়। সমস্যা হলো: যদি ডিভাইসে একটি রোগ (rogue) CA সার্টিফিকেট ইনস্টল করা থাকে (যেমন একটি ক্ষতিকর VPN প্রোফাইল বা corporate MITM প্রক্সির মাধ্যমে), তাহলে ডিভাইসটি সেই রোগ CA-কেও বিশ্বাস করবে — এবং একটি আক্রমণকারী বৈধ-দেখতে একটি সার্টিফিকেট দিয়ে HTTPS ট্রাফিক পড়তে/পরিবর্তন করতে পারবে, যদিও সংযোগটি "এনক্রিপ্টেড" দেখাচ্ছে।
সার্টিফিকেট পিনিংCertificate Pinningঅ্যাপ নিজেই একটি নির্দিষ্ট সার্টিফিকেট বা পাবলিক কী "পিন" করে রাখে তার নিজস্ব ব্যাকএন্ডের জন্য — ডিভাইসের সাধারণ CA ট্রাস্ট স্টোরের উপর নির্ভর না করে। ফলে ডিভাইসে যত বিশ্বস্ত (বা রোগ) CA-ই থাকুক না কেন, অ্যাপ শুধু সেই নির্দিষ্ট সার্টিফিকেট/কী-কেই গ্রহণ করবে। হলো এই সমস্যার সমাধান — অ্যাপ ডিভাইসের সাধারণ CA তালিকা উপেক্ষা করে শুধুমাত্র তার নিজের ব্যাকএন্ডের জন্য নির্দিষ্ট, প্রত্যাশিত সার্টিফিকেট/পাবলিক-কী গ্রহণ করে — অন্য যেকোনো সার্টিফিকেট প্রত্যাখ্যাত হয়, এমনকি যদি সেটি ডিভাইসের কাছে "বৈধ" মনে হয়।
৪ · প্ল্যাটফর্ম স্যান্ডবক্সিং মডেল ও পারমিশন গেট
Android ও iOS উভয়েই ডিফল্টভাবে একটি স্যান্ডবক্সিংApp Sandboxingপ্রতিটি অ্যাপকে তার নিজস্ব বিচ্ছিন্ন প্রসেস, ফাইল স্টোরেজ ও মেমরিতে সীমাবদ্ধ রাখা — একটি অ্যাপ অন্য অ্যাপের ডেটা বা সিস্টেম রিসোর্স সরাসরি অ্যাক্সেস করতে পারে না, যদি না OS স্পষ্টভাবে অনুমতি দেয়। মডেল অনুসরণ করে — একটি অ্যাপ কখনোই সরাসরি আরেকটি অ্যাপের ডেটা পড়তে পারে না। ক্যামেরা, লোকেশন, কন্ট্যাক্টসের মতো সংবেদনশীল রিসোর্স অ্যাক্সেস করার একমাত্র বৈধ পথ হলো পারমিশন সিস্টেম — এই নিয়ন্ত্রিত ব্যতিক্রম মডেলটি বিস্তারিতভাবে পরের পাঠ (L43) কভার করবে।
৫ · অতিরিক্ত পারমিশন শনাক্তকরণ — একটি সাধারণ অডিটর
একটি অ্যাপ যে পারমিশন চায় তা তার ঘোষিত কাজের সাথে সামঞ্জস্যপূর্ণ কি না — এটি একটি সহজ কিন্তু কার্যকর প্রাথমিক নিরাপত্তা/প্রাইভেসি যাচাই। নিচের কোড সেলটি প্রতিটি অ্যাপের ঘোষিত উদ্দেশ্যের জন্য "প্রত্যাশিত" পারমিশনের একটি বেসলাইনের সাথে তুলনা করে অতিরিক্ত পারমিশন ফ্ল্যাগ করে — সম্পূর্ণ ইন-মেমরি সিমুলেশন, কোনো বাস্তব ডিভাইস বা অ্যাপ স্টোর ডেটার সাথে সংযুক্ত নয়।
apps = {
"SimpleFlashlight": {"purpose": "flashlight",
"permissions": {"CAMERA_FLASH", "CONTACTS", "LOCATION"}},
"WeatherNow": {"purpose": "weather",
"permissions": {"LOCATION", "INTERNET"}},
"SecureNotes": {"purpose": "notes",
"permissions": {"STORAGE", "INTERNET"}},
}
# প্রতিটি ব্যবহারের-উদ্দেশ্যের জন্য যুক্তিসঙ্গত ("প্রত্যাশিত") পারমিশনের বেসলাইন
expected_permissions = {
"flashlight": {"CAMERA_FLASH"},
"weather": {"LOCATION", "INTERNET"},
"notes": {"STORAGE", "INTERNET"},
}
def audit_permissions(app_name, app_data, expected_map):
purpose = app_data["purpose"]
requested = app_data["permissions"]
expected = expected_map.get(purpose, set())
excessive = requested - expected
return excessive
print("অতিরিক্ত-পারমিশন অডিট রিপোর্ট")
print("-" * 40)
for name, data in apps.items():
excessive = audit_permissions(name, data, expected_permissions)
if excessive:
print(f"[সতর্কতা] {name} ({data['purpose']}) — অতিরিক্ত পারমিশন: {sorted(excessive)}")
else:
print(f"[ঠিক আছে] {name} ({data['purpose']}) — কোনো অতিরিক্ত পারমিশন নেই")
SimpleFlashlight একটি ফ্ল্যাশলাইট অ্যাপ হয়েও CONTACTS ও
LOCATION চাইছে, যার কোনোটিই ফ্ল্যাশলাইট জ্বালানোর সাথে সম্পর্কিত নয় — এটিই একটি ক্লাসিক
অতিরিক্ত-পারমিশন রেড ফ্ল্যাগ। বাস্তব অ্যাপ স্টোর রিভিউ প্রক্রিয়া (Google Play Protect, Apple App Review) এই
ধরনের কিছু কেস আংশিকভাবে ধরে, কিন্তু নিখুঁত নয় — ব্যবহারকারীর নিজের সতর্কতাও প্রতিরক্ষার একটি স্তর।
মোবাইল অ্যাপ সিকিউরিটি ওয়েব সিকিউরিটির সাথে অনেক নীতি শেয়ার করে (least privilege, defense in depth, ইনপুট যাচাই) কিন্তু প্ল্যাটফর্ম-নির্দিষ্ট প্রয়োগ ভিন্ন — স্যান্ডবক্সিং, IPC, ও পারমিশন মডেল বোঝা একজন মোবাইল সিকিউরিটি টেস্টারের জন্য অপরিহার্য। পরের পাঠে আমরা এন্টারপ্রাইজ পর্যায়ে এই ডিভাইসগুলো কীভাবে ম্যানেজ করা হয় তা দেখব।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ TLS-এর স্বাভাবিক CA ট্রাস্ট চেইন (L37) থাকা সত্ত্বেও একটি অ্যাপের কেন সার্টিফিকেট পিনিং দরকার হতে পারে?
সাধারণ CA ট্রাস্ট চেইন ডিভাইসের সিদ্ধান্তের উপর নির্ভর করে — ডিভাইসে যদি কোনো রোগ CA (একটি ক্ষতিকর VPN প্রোফাইল বা corporate প্রক্সির মাধ্যমে) ইনস্টল থাকে, তাহলে ডিভাইসটি সেটিকেও বৈধ হিসেবে বিশ্বাস করবে। সার্টিফিকেট পিনিং অ্যাপকে ডিভাইসের এই সিদ্ধান্তের উপর নির্ভর না করে নিজস্ব, নির্দিষ্ট সার্টিফিকেট প্রত্যাশা করতে দেয় — তাই ডিভাইস-লেভেল MITM হলেও অ্যাপ সংযোগ প্রত্যাখ্যান করে।
প্র ০২ একটি এক্সপোর্টেড (exported) IPC কম্পোনেন্ট ভুলবশত রেখে দিলে বাস্তবে কী ঘটতে পারে — একটি উদাহরণ দিন।
ধরা যাক একটি ব্যাংকিং অ্যাপের "ব্যালেন্স ট্রান্সফার" সার্ভিস ভুলবশত exported রয়ে গেছে। ডিভাইসে ইনস্টল করা একটি সম্পূর্ণ অসম্পর্কিত, ক্ষতিকর অ্যাপ তখন সেই সার্ভিসটি সরাসরি কল করতে পারবে — ব্যবহারকারী ব্যাংকিং অ্যাপ খোলা বা কোনো ইন্টারঅ্যাকশন করা ছাড়াই। এটি দেখায় কেন কম্পোনেন্ট শুধুমাত্র প্রয়োজনীয় ক্ষেত্রেই exported করা উচিত, এবং exported হলেও ইনপুট যাচাই আবশ্যক।
প্র ০৩ একটি অতিরিক্ত পারমিশন কখনো অপব্যবহার না হলেও কেন এটি এখনো একটি নিরাপত্তা ঝুঁকি বলে বিবেচিত হয়?
এটি least-privilege নীতির (L31) সরাসরি লঙ্ঘন — প্রতিটি অতিরিক্ত পারমিশন attack surface বাড়ায়। যদি ভবিষ্যতে অ্যাপটি কম্প্রোমাইজড হয় (একটি সাপ্লাই-চেইন আক্রমণ, একটি দুর্বল লাইব্রেরি, বা একজন malicious insider ডেভেলপার), তাহলে আক্রমণকারী ইতিমধ্যে-অনুমোদিত সেই অতিরিক্ত পারমিশনগুলো ব্যবহার করতে পারবে — অ্যাপটি "নিরীহ" থাকার সময়েও ঝুঁকিটি বিদ্যমান থাকে, শুধু ব্যবহার না হওয়া পর্যন্ত।
অনুশীলন
-
চিন্তা করুন: আপনার ফোনে ইনস্টল করা যেকোনো একটি অ্যাপ বেছে নিন এবং সেটির চাওয়া পারমিশনগুলো
দেখুন। প্রতিটি পারমিশন কি অ্যাপের মূল কাজের সাথে যুক্তিসঙ্গতভাবে সম্পর্কিত?
নির্দিষ্ট উত্তর নেই — লক্ষ্য হলো সচেতন হওয়া। যদি কোনো পারমিশন অ্যাপের ঘোষিত কাজের সাথে অসামঞ্জস্যপূর্ণ মনে হয় (যেমন একটি PDF রিডার অ্যাপ মাইক্রোফোন চাইছে), সেটি Settings থেকে প্রত্যাখ্যান/প্রত্যাহার করার বিবেচনা করুন — বেশিরভাগ আধুনিক ফিচার এই ধরনের অপ্রয়োজনীয় পারমিশন ছাড়াই কাজ করে।
-
পরীক্ষা করুন: উপরের কোডে
appsডিকশনারিতে একটি নতুন এন্ট্রি"QRScanner": {"purpose": "flashlight", "permissions": {"CAMERA_FLASH", "SMS"}}যোগ করে Run চাপুন এবং দেখুন এটি ফ্ল্যাগ হয় কি না।হ্যাঁ, এটি ফ্ল্যাগ হবে —
expected_permissions["flashlight"]শুধু{"CAMERA_FLASH"}, তাইSMSপারমিশনটিexcessive-এ চলে আসবে এবং অডিটর সেটিকে "অতিরিক্ত পারমিশন" হিসেবে রিপোর্ট করবে — একটি ফ্ল্যাশলাইট অ্যাপের SMS চাওয়ার কোনো যুক্তিসঙ্গত কারণ নেই।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৬০টি পাঠ পরবর্তী পাঠ — মোবাইল ডিভাইস ম্যানেজমেন্ট (MDM) ও রানটাইম অ্যাপ পারমিশন মডেল।
- System Design & Software Architecture কোর্স সঙ্গী কোর্স ব্যাকএন্ড API ও ডেটা স্টোরেজ ডিজাইন কীভাবে ক্লায়েন্ট-সাইড সিকিউরিটি সিদ্ধান্তকে প্রভাবিত করে তা দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design ও Cybersecurity — সব এক জায়গায়।