প্রধান প্রকল্প · ParanoidBSD

এমন একটি অপারেটিং সিস্টেম যেখানে কর্তৃত্ব ধরে রাখতে হয়, ধরে নেওয়া যায় না

প্রায় প্রতিটি অনুপ্রবেশ একইভাবে ঘটে: একটি প্রোগ্রাম এমন কিছুতে হাত বাড়ায় যা তার ছোঁয়ার কথা ছিল না। ParanoidBSD এমনভাবে গড়া একটি অপারেটিং সিস্টেম যাতে সেটা করাই না যায়। প্রতিটি প্রোগ্রাম কেবল যা দরকার তা-ই পায়, আর বাকি সব শুধু নিষিদ্ধ নয় — নাগালেরই বাইরে। HardenedBSD-র উপরে গড়া, আধুনিক C++-এ নতুন করে লেখা, মূলটি পাশে রাখা আছে যাতে প্রতিটি পরিবর্তন তার সঙ্গে মিলিয়ে দেখা যায়।

ভাষাC / C++23
মূলHardenedBSD 15-STABLE
ডেস্কটপKDE Plasma 6
সর্বশেষ পুশসম্প্রতি
স্টার—
রিপোজিটরির বিন্যাস
pbsd/C++23 মডিউল — কার্নেল নিউক্লিয়াস, ইউজারল্যান্ড পোর্ট, UDA, BIFROST, কম্পোজিটর, থিম
hbsd/HardenedBSD 15-STABLE সোর্স — মূলটাই, স্পেসিফিকেশন হিসেবে রাখা
kde/ডেস্কটপ পর্বের জন্য Plasma 6, KWin ও ফ্রেমওয়ার্ক
tools/তালিকা, নির্ধারণবাদী পুনর্লিখনের ধাপ, এজেন্ট পোর্ট, Clang সহায়ক
docs/স্পেসিফিকেশন, নিরাপত্তার মডেল, মাইগ্রেশনের অবস্থা, উৎস-নির্দেশ
scripts/Linux-এর জন্য Windows সাবসিস্টেম (WSL) ড্রাইভার স্ক্রিপ্ট, ওয়াচডগ, অগ্রগতির কনসোল
সহজ কথায়

এটি কী, এক মিনিটে

সমস্যা

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

সমাধান

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

কাদের জন্য

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

নিরাপত্তা অ্যাপ্লিকেশন স্তরে শুরু হওয়া উচিত নয়। শুরু হওয়া উচিত তার নিচের অপারেটিং সিস্টেম থেকে। এই পাতার বাকিটা প্রকৌশল: কী বদলানো হলো, কীভাবে যাচাই হলো, আর কী এখনও শেষ হয়নি।
সমস্যা

পরিবেষ্টিত কর্তৃত্ব সেই বাগ যা আপনি প্যাচ করতে পারবেন না

সাধারণ একটি Unix-এ কোনো প্রসেস এই অধিকার ধারণ করে না যে সে খুলতে পারবে /etc/master.passwd। সে শুধু চেয়ে বসে, আর প্রসেসটি নিজেকে কে বলে দাবি করছে তার ভিত্তিতে কার্নেল পরে সিদ্ধান্ত নেয়। প্রতিটি প্রসেস সিস্টেমের প্রতিটি সম্পদের নাম ধরে ডাকতে পারে। নামস্থানটি বৈশ্বিক ও পরিবেষ্টিত; পরীক্ষাটা আসে সবার শেষে, প্রায় বাড়তি ভাবনার মতো।

এই কারণেই একটি ফন্ট রেন্ডারারের একটিমাত্র পার্সিং বাগ পাসওয়ার্ড চুরিতে গড়াতে পারে। রেন্ডারারের পাসওয়ার্ড ফাইলটির কোনো দরকারই ছিল না — কিন্তু স্থাপত্যের কিছুই তাকে চাইতে বাধা দেয়নি।

HardenedBSD এখানে ইতিমধ্যেই গুরুতর কাজ করে: ঠিকানা-পরিসরের বিন্যাস এলোমেলোকরণ (ASLR), যা প্রতিবার প্রোগ্রামটিকে অন্য জায়গায় তোলে, ফলে আক্রমণকারী কিছুর অবস্থান আন্দাজ করতে পারে না; নিয়ন্ত্রণ-প্রবাহের অখণ্ডতা (CFI), যা প্রোগ্রামকে এমন কোডে চালিয়ে নেওয়া আটকায় যা চালানোর জন্য সেটি কখনও তৈরিই হয়নি; আর সেগুলির পাশে PaX থেকে আসা প্রতিরোধ, SafeStack ও কঠোরীকৃত মেমরি অ্যালোকেটর। PBSD সবই রাখে, আর নিচের প্রশ্নটার চেহারাই বদলে দেয় — “এই প্রসেসের কি অনুমতি আছে?” থেকে “এই প্রসেস কি ওটার একটা হ্যান্ডল ধরে আছে?”-তে।

একটি সিস্টেম কলের উত্তর দেওয়ার দুটি পথ

// Ambient authority — the traditional path
int fd = open("/etc/master.passwd", O_RDONLY);
// kernel walks a global namespace, then
// checks uid/gid/MAC after the fact

// Handle nucleus — the PBSD path
auto f = dir_handle.open("master.passwd", Rights::Read);
// there is no global namespace to walk.
// no handle, no name, no operation.

পার্থক্যটার একটি দৃষ্টান্তমূলক চেহারা, একটি প্রোগ্রাম কার্নেলে যেসব কল করে — অর্থাৎ তার অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস বা API — তার হুবহু তালিকা নয়। প্রামাণিক মডেলটি আছে এখানে docs/.

দুটি কর্তৃত্ব মডেল পাশাপাশি: পরিবেষ্টিত কর্তৃত্বে প্রসেস সকেট, exec ও ptrace পর্যন্ত পৌঁছায় এবং পাসওয়ার্ড ফাইল চাওয়ার পরেই কেবল ফেরানো হয়; হ্যান্ডল নিউক্লিয়াসে যে সম্পদের হ্যান্ডল তার হাতে আছে কেবল সেটির নামই ধরা যায়
পুরো চিত্রটি দেখতে স্ক্রল করুন →
পরীক্ষাটা কোথায় হয়। বাঁদিকে অনুরোধ সবসময় যাত্রা করে, বিচার হয় তার পরে। ডানদিকে চারটি কাজের মধ্যে তিনটির চাওয়ার মতো কোনো নামই নেই, তাই ফেরানোরও কিছু নেই।
ইন্টারঅ্যাক্টিভ

একটি সিস্টেম কলকে নিউক্লিয়াসের ভিতর দিয়ে চালিয়ে দেখুন

প্রসেসটিকে কিছু হ্যান্ডল দিন, সে কী করার চেষ্টা করবে বেছে নিন, আর দুটি কর্তৃত্ব মডেলের মধ্যে অদলবদল করুন। রায় আর তার যুক্তি আপনার ব্রাউজারেই তখনই হিসাব হয় — এটি নকশাটির একটি শিক্ষামূলক মডেল, কার্নেল এমুলেটর নয়।

ক্যাপাবিলিটি নিউক্লিয়াস — রেফারেন্স মনিটর

প্রসেসটি চেষ্টা করে…

ট্রেস

প্রসেসের হাতে থাকা হ্যান্ডল

রায়

চেষ্টার অপেক্ষায়
মনিটরের ভিতর দিয়ে চালাতে একটি কাজ বেছে নিন।
নাগালে
0
প্রত্যাখ্যাত
0

“নাগালে” গোনে যে, বর্তমান মডেলে এই প্রসেস তালিকাভুক্ত কাজগুলির মধ্যে ক-টা আদৌ করতে পারত। পরিবেষ্টিত কর্তৃত্বে নাগাল ঠিক করে পরিচয়; নিউক্লিয়াসে, তার হাতে সত্যিই যে হ্যান্ডলগুলি আছে সেগুলি।

এই পাতার জন্য লেখা PBSD নিরাপত্তা নকশার একটি শিক্ষামূলক মডেল। আসল নিউক্লিয়াস থাকে pbsd/-এ; স্পেসিফিকেশন আছে docs/specs/.
পোর্ট

চারটি ধাপ, আর এমন একটি মডেল যে কখনও নিজেকে শংসা দেয় না

একটি বার্কলি সফটওয়্যার ডিস্ট্রিবিউশনের (BSD) ইউজারল্যান্ড ও কার্নেল হাতে ধরে C++23-এ পোর্ট করা এক দশকের কাজ। একটি ভাষা-মডেলকে ফাইল নতুন করে লিখতে বলে পোর্ট করা বিশ্বাসযোগ্য আবর্জনা বানানোর দ্রুত উপায়। PBSD কোনোটাই করে না।

ParanoidBSD-র পোর্ট পাইপলাইন: তালিকা, নির্ধারণবাদী ধাপ, এজেন্ট লুপ ও একটি যাচাইয়ের গেট, যেখানে বাতিল হওয়া ফাইল আবার লুপে ফিরে আসে
পুরো চিত্রটি দেখতে স্ক্রল করুন →
একটি ফাইল কীভাবে পোর্ট করা ফাইল হয়ে ওঠে। লাল ড্যাশ দেওয়া পথটাই আসল কথা — যে কাজ যাচাইয়ে আটকায় তা অগ্রগতি হিসেবে গোনা না হয়ে লুপে ফিরে যায়।
ধাপ ১

তালিকা

tools/inventory_c_sources.py ও clang_cxx23_port.py প্রতিটি C ফাইলকে কঠিনতা অনুযায়ী নম্বর দেয় আর লেখে c_inventory.csv। পরিসর নিয়ে কিছুই আন্দাজ করা হয় না।

ধাপ ২

নির্ধারণবাদী ধাপ

run_todo_passes.py ০–৪ স্তরে নিরাপদ যান্ত্রিক পুনর্লিখন চালায়। কোনো মডেল জড়িত নেই। কোনো ধাপ যা নিতে চায় না, তা জোর না করে লগ করা হয় refusals.jsonl ফাইলে।

ধাপ ৩

এজেন্ট লুপ

pbsd.py স্টাব করা আর প্রত্যাখ্যাত ফাইলগুলি ভরে DeepSeek Flash দিয়ে, দরকারে সর্বোচ্চ রিজনিং এফর্টে Pro-তে তুলে — পূর্বনির্ধারিতভাবে ৪৮টি Flash আর ২৪টি Pro ওয়ার্কার। Kickstarter এরই তহবিল জোগায়।

ধাপ ৪

যাচাইয়ের গেট

কম্পাইল, ASan, UBSan, ডিফারেনশিয়াল এক্সিকিউশন আর কম্পাইলারের মধ্যবর্তী উপস্থাপনার (IR) স্তরে তুলনা। যে ফাইল শুধু কম্পাইল হয়, সেটি যাচাই হয়নি। ব্যর্থতাগুলি গিয়ে জমা হয় agent_port_failures.jsonl.

BSD ডিমনকে দুবার দেখানো হয়েছে: বাঁদিকে মূল লাল মাসকট, ডানদিকে সেই একই মূর্তি সায়ান ওয়্যারফ্রেমে আঁকা, দুইয়ের মাঝে একটি সমান চিহ্ন
একটি ছবিতে গোটা প্রকল্প। একই ডিমন, একই আকার, অন্য একটি রূপে আবার গড়া — আর সমান চিহ্নটাই সেই অংশ যা ফাইল ধরে ধরে, ডিফারেনশিয়াল যাচাই দিয়ে অর্জন করতে হয়। BSD Daemon © Marshall Kirk McKusick।
“সমান” বলতে যা বোঝাতেই হবে

পোর্ট মানেই সমতুল্যতার একটা দাবি

একটি ফাইল পোর্ট হয়ে গেছে বলার মানে, নতুনটি পুরনোটির মতোই আচরণ করে। ওটা একটা দাবি, আর দাবির প্রমাণ লাগে। যে C++23 পুনর্লিখন কম্পাইল হয় তা বিশ্বাসযোগ্য দেখতে একটা ওয়্যারফ্রেম; সেটি এখনও সেই একই ডিমন নয়।

তাই সমান চিহ্নটাই গেট। ডিফারেনশিয়াল চালনা দুটোকেই চালিয়ে বাইরে থেকে দেখা আচরণ মিলিয়ে দেখে। IR তুলনা দেখে কম্পাইলারের কাছে দুটোর মানে এক কি না। এর একটিও না পেরোনো পর্যন্ত ফাইলটি মাইগ্রেশন লগে খোলা থাকে এবং অগ্রগতিতে গোনা হয় না — দেখতে যতই শেষ হয়ে যাওয়া লাগুক।

যে নিয়মটি এটিকে সমর্থনযোগ্য করে: মডেল নিজের শংসাপত্র নিজে দেয় না। সে প্রস্তাব দেয়; ঠিক করে নির্ধারণবাদী সরঞ্জাম। রিপোজিটরির প্রতিটি আপসহীন নিয়ম ওই সীমারেখাটি অটুট রাখার জন্যই আছে — আর এই কারণেই শুধু ইনফারেন্সে বেশি খরচ করে পোর্টটাকে আরও দ্রুত চালানো যায় না।
আপসহীন নিয়ম

রিপোজিটরি সত্যিই যে নিয়মে বাঁধা

ডিফারেনশিয়াল বা IR যাচাই না পেরোনো পর্যন্ত কোনো ফাইল শেষ নয়
কম্পাইল হওয়াকে যাচাই না হওয়া ধরা হয়। পোর্ট করা ফাইলকে হয় ডিফারেনশিয়াল চালনায় HardenedBSD-র মূলটির সঙ্গে হুবহু একই বাইরে-থেকে-দেখা আচরণ দেখাতে হবে, নয়তো IR স্তরে মিলতে হবে। যে ফাইল দুটোর একটিও পারে না, তা মাইগ্রেশন লগে খোলা থাকে এবং অগ্রগতির হিসাবে গোনা হয় না।
বিশ্বস্তভাবে পোর্ট করুন — মূলের বাগ চুপচাপ “সারিয়ে” দেবেন না
HardenedBSD গাছটিই আচরণের নির্দিষ্টকরণ। মূলটিতে যদি ত্রুটি থাকে, পোর্টও সেটি ফিরিয়ে আনে, কারণ একটি ডিফারেনশিয়াল পরীক্ষা সারাই আর রিগ্রেশনের তফাত করতে পারে না। উন্নতি হয় পরে, আলাদা করে লিখে রেখে, যাতে পরিবর্তনটি অনুবাদের ভিতরে চাপা না পড়ে দৃশ্যমান ও পর্যালোচনাযোগ্য থাকে।
আগে নির্ধারণবাদী সরঞ্জাম; যা বাকি থাকে কেবল সেটুকুই মডেল ভরায়
যান্ত্রিক পুনর্লিখন প্রয়োগ করে এমন স্ক্রিপ্ট, যারা প্রতিবার হুবহু একই আচরণ করে। মডেল ব্যবহার হয় শুধুই অবশিষ্টটুকুতে — তালিকার স্টাব করা এন্ট্রি আর নির্ধারণবাদী ধাপগুলি যে ফাইলগুলি নিতে চায়নি। এতে পোর্টের বেশিরভাগটাই পুনরুৎপাদনযোগ্য ও নিরীক্ষাযোগ্য থাকে, আর মডেলের আউটপুট সেই অংশেই সীমাবদ্ধ থাকে যা একজন মানুষকে এমনিতেও হাতে লিখতে হতো।
কার্নেল C++ স্বাধীন: -fno-exceptions -fno-rtti
কার্নেল নিউক্লিয়াস হোস্টেড C++ রানটাইমের উপর নির্ভর করতে পারে না। কোনো এক্সেপশন নয়, চলার সময়ের টাইপ তথ্য (RTTI) নয়, কার্নেলে ঢোকার মুখে হিপ থেকে বরাদ্দ নেয় এমন স্ট্যান্ডার্ড লাইব্রেরির পথ নয়। শর্তগুলি লেখা আছে docs/specs/KERNEL_CXX_ABI.md ফাইলে, যাতে একজন অবদানকারী আন্দাজ না করেই বুঝতে পারেন কার্নেল প্রসঙ্গে কোনটা বৈধ।
শেষ বলে গোনার আগে প্রতিটি মডিউলের একটি উৎস-নির্দেশের এন্ট্রি লাগে
docs/PROVENANCE.md লিখে রাখে কোন মডিউল কোথা থেকে এসেছে আর কোন লাইসেন্সে। এর জন্যই নিচের লাইসেন্সিং বিবৃতি আকাঙ্ক্ষা না থেকে যাচাইযোগ্য হয় — আপনি মডিউল ধরে ধরে দেখতে পারেন কোন কোড HardenedBSD থেকে এসেছে আর কোনটি নতুন PBSD-র কাজ।
লাইসেন্সিং

দুটি লাইসেন্স, সৎভাবে আলাদা করা

নতুন PBSD কোড — নিউক্লিয়াস, C++23 মডিউল, সরঞ্জাম — দেওয়া হয় Imortek-এর চালু শর্তে: GNU Affero জেনারেল পাবলিক লাইসেন্স (AGPL-3.0+), ব্যক্তিগত ব্যবহার, দাতব্য সংস্থা, শিক্ষা আর বছরে ৫০,০০০ অস্ট্রেলীয় ডলারের (AUD) কম আয়ের প্রতিষ্ঠানের জন্য বিনামূল্যে, তার উপরে স্তরভিত্তিক বাণিজ্যিক লাইসেন্স।

HardenedBSD থেকে আসা কোড তার মূল BSD লাইসেন্সেই থাকে। সেটি পুনরায় লাইসেন্স করা যায় না, আর Imortek তেমন দাবিও করে না। docs/PROVENANCE.md বলে দেয় কোনটি কোনটা।

পুরো লাইসেন্সিং শর্ত →
AGPL-3.0+ ও বাণিজ্যিক

নতুন PBSD-র কাজ

pbsd/, tools/, scripts/, ক্যাপাবিলিটি নিউক্লিয়াস, UDA, BIFROST, কম্পোজিটর ও থিম।

BSD (অপরিবর্তিত)

HardenedBSD থেকে উদ্ভূত

hbsd/ এবং সূত্র ধরে তার কাছেই ফিরে যায় এমন প্রতিটি পোর্ট করা ফাইল। মূল শর্ত, মূল কৃতিত্ব।

কাদের জন্য

এমন একটি অপারেটিং সিস্টেম, যাতে ঢোকা কঠিন

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

01

প্রতিরক্ষা ও সরকারি সরবরাহকারী

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

02

বছরের পর বছর মাঠে পড়ে থাকা যন্ত্রপাতি

কারখানার কন্ট্রোলার, চিকিৎসার যন্ত্র, ইউটিলিটির হার্ডওয়্যার। ত্রুটি ধরা পড়লে অনেক সময় আপনি স্রেফ একটা আপডেট ঠেলে দিতে পারেন না। এটি ঠিক করে দেয় ভিতরে ঢুকে পড়ার পর অনুপ্রবেশকারী কতদূর যেতে পারবে, কারণ কোনো প্রোগ্রামই তার হাতে যা দেওয়া হয়েছে তার বাইরে পৌঁছাতে পারে না।

03

বিশ্ববিদ্যালয় ও নিরাপত্তা গবেষক

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

নিজের অবস্থাটা এখানে চিনতে পারছেন? এটি এখনই বেটা পরীক্ষার জন্য খোলা, আর যাদের জন্য এটি বানানো তাদের মতামতই একে সত্যিই বদলায়। বেটা টেস্টার হোন →
Kickstarter চালু · শেষ হচ্ছে ১২ নভেম্বর ২০২৬

পোর্টটি চলে এমন কম্পিউটে, যা তার হাতে নেই

নির্ধারণবাদী ধাপগুলি বিনামূল্যের। অবশিষ্টটুকু যে এজেন্ট লুপ ভরায় — আর যে যাচাই-চালনাগুলি সেটিকে গেটে আটকায় — সেগুলি নয়। চাওয়াটা এইটুকুই।