গত দুই সপ্তাহে, আমরা জনপ্রিয় ওপেন-সোর্স পাসওয়ার্ড ম্যানেজার KeePass-এ "মাস্টার পাসওয়ার্ড ক্র্যাক" হিসাবে বর্ণনা করা হয়েছে এমন একটি সিরিজ নিবন্ধ দেখেছি।
একটি সরকারী মার্কিন সরকার শনাক্তকারী পেতে বাগটি যথেষ্ট গুরুত্বপূর্ণ বলে বিবেচিত হয়েছিল (এটি হিসাবে পরিচিত জন্য CVE-2023-32784, যদি আপনি এটি খুঁজে বের করতে চান), এবং আপনার পাসওয়ার্ড ম্যানেজারের মাস্টার পাসওয়ার্ডটি আপনার পুরো ডিজিটাল দুর্গের মূল চাবিকাঠি, আপনি বুঝতে পারবেন কেন গল্পটি প্রচুর উত্তেজনাকে উস্কে দিয়েছে।
ভাল খবর হল যে একজন আক্রমণকারী যে এই বাগটি কাজে লাগাতে চেয়েছিল তার প্রায় অবশ্যই অবশ্যই আপনার কম্পিউটারকে ম্যালওয়্যার দ্বারা সংক্রামিত করতে হবে, এবং সেইজন্য যেভাবেই হোক আপনার কীস্ট্রোক এবং চলমান প্রোগ্রামগুলিতে গুপ্তচরবৃত্তি করতে সক্ষম হবে৷
অন্য কথায়, বাগটিকে একটি সহজে-পরিচালিত ঝুঁকি হিসাবে বিবেচনা করা যেতে পারে যতক্ষণ না KeePass এর নির্মাতা একটি আপডেট নিয়ে আসে, যা শীঘ্রই প্রদর্শিত হবে (আপাতদৃষ্টিতে জুন 2023 এর শুরুতে)।
বাগ প্রকাশক হিসাবে যত্ন নেয় খুঁজে বের করা:
আপনি যদি একটি শক্তিশালী পাসওয়ার্ড সহ সম্পূর্ণ ডিস্ক এনক্রিপশন ব্যবহার করেন এবং আপনার সিস্টেম [ম্যালওয়্যার থেকে মুক্ত] হয়, তাহলে আপনার ভালো হওয়া উচিত। একা এই অনুসন্ধানের মাধ্যমে ইন্টারনেটে দূর থেকে কেউ আপনার পাসওয়ার্ড চুরি করতে পারবে না।
ঝুঁকি ব্যাখ্যা করা হয়েছে
খুব সংক্ষিপ্তভাবে বলা হয়েছে, বাগটি নিশ্চিত করতে অসুবিধা হয় যে গোপনীয় ডেটার সমস্ত চিহ্ন মেমরি থেকে মুছে ফেলা হয় একবার আপনি সেগুলি দিয়ে শেষ করেছেন৷
মেমরিতে গোপন ডেটা থাকা এড়ানোর সমস্যাগুলি আমরা এখানে উপেক্ষা করব, এমনকি সংক্ষিপ্তভাবে।
এই নিবন্ধে, আমরা শুধু প্রোগ্রামারদের মনে করিয়ে দিতে চাই যে কোডটি নিরাপত্তা-সচেতন পর্যালোচক দ্বারা অনুমোদিত একটি মন্তব্যের সাথে যেমন "নিজের পরে সঠিকভাবে পরিষ্কার হতে দেখা যাচ্ছে"...
…আসলে পুরোপুরি পরিষ্কার নাও হতে পারে, এবং সম্ভাব্য ডেটা ফাঁস কোডের সরাসরি অধ্যয়ন থেকে স্পষ্ট নাও হতে পারে।
সহজ কথায়, CVE-2023-32784 দুর্বলতার মানে হল যে KeePass প্রোগ্রাম থেকে বেরিয়ে যাওয়ার পরেও একটি KeePass মাস্টার পাসওয়ার্ড সিস্টেম ডেটা থেকে পুনরুদ্ধারযোগ্য হতে পারে, কারণ আপনার পাসওয়ার্ড সম্পর্কে যথেষ্ট তথ্য (যদিও প্রকৃতপক্ষে কাঁচা পাসওয়ার্ড নয়, যা আমরা ফোকাস করব। কিছুক্ষণের মধ্যে চালু) সিস্টেম অদলবদল বা স্লিপ ফাইলের পিছনে ফেলে যেতে পারে, যেখানে বরাদ্দকৃত সিস্টেম মেমরি পরবর্তী সময়ের জন্য সংরক্ষিত হতে পারে।
একটি উইন্ডোজ কম্পিউটারে যেখানে সিস্টেমটি বন্ধ থাকা অবস্থায় হার্ডডিস্ক এনক্রিপ্ট করতে বিটলকার ব্যবহার করা হয় না, এটি এমন একটি অপরাধীকে দেবে যে আপনার ল্যাপটপ চুরি করেছে একটি ইউএসবি বা সিডি ড্রাইভ থেকে বুট আপ করার এবং এমনকি আপনার মাস্টার পাসওয়ার্ড পুনরুদ্ধার করার লড়াইয়ের সুযোগ। যদিও KeyPass প্রোগ্রাম নিজেই খেয়াল রাখে না যে এটিকে ডিস্কে স্থায়ীভাবে সংরক্ষণ করা হয় না।
মেমরিতে একটি দীর্ঘমেয়াদী পাসওয়ার্ড ফাঁস হওয়ার অর্থ হল যে পাসওয়ার্ডটি, তাত্ত্বিকভাবে, কীপাস প্রোগ্রামের মেমরি ডাম্প থেকে পুনরুদ্ধার করা যেতে পারে, এমনকি যদি সেই ডাম্পটি আপনি পাসওয়ার্ড টাইপ করার অনেক পরে এবং KeePass-এর অনেক পরে ধরে নেওয়া হয়। নিজের কাছে এটি রাখার আর প্রয়োজন ছিল না।
স্পষ্টতই, আপনার অনুমান করা উচিত যে আপনার সিস্টেমে ইতিমধ্যে থাকা ম্যালওয়্যারগুলি বিভিন্ন রিয়েল-টাইম স্নুপিং কৌশলগুলির মাধ্যমে প্রায় কোনও টাইপ-ইন পাসওয়ার্ড পুনরুদ্ধার করতে পারে, যতক্ষণ না আপনি টাইপ করার সময় সক্রিয় ছিল। কিন্তু আপনি যুক্তিসঙ্গতভাবে আশা করতে পারেন যে আপনার বিপদের সংস্পর্শে আসার সময়টি টাইপ করার সংক্ষিপ্ত সময়ের মধ্যে সীমাবদ্ধ থাকবে, আপনার কম্পিউটার বন্ধ করার পরেও অনেক মিনিট, কয়েক ঘন্টা বা দিন বা সম্ভবত আরও বেশি সময় বাড়ানো হবে না।
পিছনে কি বাকি পায়?
তাই আমরা ভেবেছিলাম যে কোড থেকে সরাসরি স্পষ্ট নয় এমন উপায়ে গোপন ডেটা কীভাবে মেমরিতে রেখে যেতে পারে তা আমরা উচ্চ-স্তরের দিকে নজর দেব।
আপনি যদি একজন প্রোগ্রামার না হন তবে চিন্তা করবেন না – আমরা এটিকে সহজ রাখব, এবং আমরা যাওয়ার সাথে সাথে ব্যাখ্যা করব।
আমরা একটি সাধারণ সি প্রোগ্রামে মেমরির ব্যবহার এবং পরিষ্কারের দিকে নজর দিয়ে শুরু করব যা নিম্নলিখিতগুলি করে পাসওয়ার্ড প্রবেশ এবং অস্থায়ীভাবে সংরক্ষণ করার অনুকরণ করে:
- মেমরি একটি উত্সর্গীকৃত খণ্ড বরাদ্দ বিশেষ করে পাসওয়ার্ড সংরক্ষণ করার জন্য।
- একটি পরিচিত টেক্সট স্ট্রিং সন্নিবেশ করা হচ্ছে তাই প্রয়োজন হলে আমরা সহজেই এটি মেমরিতে খুঁজে পেতে পারি।
- 16 টি সিউডো-র্যান্ডম 8-বিট ASCII অক্ষর যুক্ত করা হচ্ছে রেঞ্জ এপি থেকে।
- প্রিন্ট আউট সিমুলেটেড পাসওয়ার্ড বাফার।
- স্মৃতিকে মুক্ত করা পাসওয়ার্ড বাফারটি মুছে ফেলার আশায়।
- প্রস্থান করা হচ্ছে কার্যক্রম.
অত্যন্ত সরলীকৃত, সি কোডটি দেখতে এরকম কিছু হতে পারে, কোন ত্রুটি পরীক্ষা না করে, সি রানটাইম ফাংশন থেকে নিম্নমানের সিউডো-র্যান্ডম নম্বর ব্যবহার করে rand()
, এবং কোনো বাফার ওভারফ্লো চেক উপেক্ষা করা (বাস্তব কোডে এর কোনোটিই করবেন না!):
// Ask for memory char* buff = malloc(128); // Copy in fixed string we can recognise in RAM strcpy(buff,"unlikelytext"); // Append 16 pseudo-random ASCII characters for (int i = 1; i <= 16; i++) { // Choose a letter from A (65+0) to P (65+15) char ch = 65 + (rand() & 15); // Modify the buff string directly in memory strncat(buff,&ch,1); } // Print it out, so we're done with buff printf("Full string was: %sn",buff); // Return the unwanted buffer and hope that expunges it free(buff);
প্রকৃতপক্ষে, আমাদের পরীক্ষায় আমরা শেষ পর্যন্ত যে কোডটি ব্যবহার করেছি তাতে নীচে দেখানো কিছু অতিরিক্ত বিট এবং টুকরো অন্তর্ভুক্ত রয়েছে, যাতে আমরা অবাঞ্ছিত বা বাঁদিকের বিষয়বস্তু খোঁজার জন্য আমাদের অস্থায়ী পাসওয়ার্ড বাফারের সম্পূর্ণ বিষয়বস্তুগুলিকে ব্যবহার করার সময় ডাম্প করতে পারি।
নোট করুন যে আমরা ইচ্ছাকৃতভাবে কল করার পরে বাফার ডাম্প করি free()
, যা টেকনিক্যালি একটি ব্যবহারের পর-মুক্ত বাগ, কিন্তু আমাদের বাফার ফিরিয়ে দেওয়ার পরে সমালোচনামূলক কিছু রেখে যায় কিনা তা দেখার একটি গোপন উপায় হিসাবে আমরা এখানে এটি করছি, যা বাস্তব জীবনে একটি বিপজ্জনক ডেটা ফাঁসের গর্ত হতে পারে।
আমরা দুটি সন্নিবেশ করেছি Waiting for [Enter]
প্রোগ্রামের মূল পয়েন্টগুলিতে মেমরি ডাম্প তৈরি করার সুযোগ দেওয়ার জন্য কোডে প্রম্পট করে, পরে অনুসন্ধান করার জন্য আমাদের কাঁচা ডেটা দেয়, যাতে প্রোগ্রামটি চলার সাথে সাথে কী বাকি ছিল তা দেখতে।
মেমরি ডাম্প করতে, আমরা মাইক্রোসফ্ট ব্যবহার করব সিসিনটার্নাল টুল procdump
সাথে -ma
বিকল্প (সব মেমরি ডাম্প), যা উইন্ডোজ ব্যবহার করার জন্য আমাদের নিজস্ব কোড লেখার প্রয়োজন এড়ায় DbgHelp
সিস্টেম এবং এটি বরং জটিল MiniDumpXxxx()
ক্রিয়াকলাপ.
C কোড কম্পাইল করার জন্য, আমরা Fabrice Bellard-এর মুক্ত এবং ওপেন-সোর্স-এর নিজস্ব ছোট এবং সহজ বিল্ড ব্যবহার করেছি ক্ষুদ্র সি কম্পাইলার, 64-বিট উইন্ডোজের জন্য উপলব্ধ উৎস এবং বাইনারি ফর্ম সরাসরি আমাদের GitHub পৃষ্ঠা থেকে।
নিবন্ধে চিত্রিত সমস্ত উত্স কোডের অনুলিপি-এবং-পাস্টযোগ্য পাঠ্য পৃষ্ঠার নীচে প্রদর্শিত হয়।
আমরা যখন পরীক্ষা প্রোগ্রামটি কম্পাইল এবং রান করি তখন এটি ঘটেছিল:
C:UsersduckKEYPASS> petcc64 -stdinc -stdlib unl1.c Tiny C কম্পাইলার - কপিরাইট (C) 2001-2023 Fabrice Bellard একটি শেখার সরঞ্জাম হিসাবে ব্যবহারের জন্য পল ডকলিন দ্বারা ছিনতাই করা হয়েছে সংস্করণ petcc64-0.9.27 [0006] - Generbit64-1 শুধুমাত্র PEs -> unl1.c -> c:/users/duck/tcc/petccinc/stdio.h [. . . .] -> c:/users/duck/tcc/petcclib/libpetcc64_32.a -> C:/Windows/system32/msvcrt.dll -> C:/Windows/system32/kernel1000.dll -------- ----------------------- virt ফাইল সাইজ সেকশন 200 438 2000 .text 800 2 3000ac .data 00 c24 1 .pdata -------- ---------- <- unl3584.exe (1 বাইট) C:UsersduckKEYPASS> unl00.exe ডাম্পিং 'নতুন' বাফার শুরুতে 51390F90: 57 5 F00 00 00 00 00 50 01 5 F00 00 00 00 00 00 .W......P....... 513F0A73: 74 65 6 33D 32 5 63C 6 64D 2 65E 78 65d 00cm exe.D 44F32B00: 513 0 72 69 76 65 72 44 61 74D 61 3A 43C 3 5 57E riverData=C:Win 69F6C00: 513 0F 64 6 77D 73 5 53 79 ডাউসসিস্টেম73Dr 74F65D6: 33 32 5 44 72 32C 00 513 0 69 76 65 72 73 5 44 iversDriverData 72F69E76: 65 72 44 61 74F 61 00 513 0 00D 45 46 43_F5 FC_34PS F33F37: 32 3 31F 00 46 50 53 5F 4372 1 00 513F 0 42 52F 4 BROWSER_APP_PROF 57F53: 45 52C 5 41F 50 50 5 50 52E 4 46D 00 51400E 49 4 45 ILE_STRING=ইন্টার 5 53 54 52C 49A 4 F47 3C AC 49B 6 74 নেট ExplzV.< কে. D 65 72A 00 51410 6E 65 74 20 45 EJJCPOMDJHAN.eD 78F70B6 : 7 56 4 3 4 00 00 00 51390 75D 6 6A 69C 6 65 6E RiverData=C:Win 79F74C65: 78 74F 4 48 4C 4 00 513 0 45 4 ডাঃ 4F43D50: 4 4 44 4 48 41C 4 00 65 00 44 00 513 0 72 69 iversDriverData 76F65E72: 44 61 74 61 3F 43 3 5 57 69D 6 00 513 0 64 6F .77F73=EFC_5F53:79F_73PS_ 74 65F 6 33 32 5 44F 72 32 00 513F 0 69 76F 65 BROWSER_APP_PROF 72F73: 5 44C 72 69F 76 65 72 44 61E 74 61D 00 513E 0 00 45 ILE_STRING=Inter 46F43: 5E 34C 33A 37 32C AC 3B 31 00 নেট ExplzV.<.K. বিনামূল্যে বাফারে [ENTER] এর জন্য অপেক্ষা করা হচ্ছে... বিনামূল্যে() 46F50 এর পরে বাফার ডাম্পিং: A53 5 F4372 1 00 513 0 42 52 4 57 F53 45 52 5 41 50 .g......P...... . 50F5A50: 52 4A 46A 00 51400 49F 4D 45 5A 53 54 52E 49 4 47 3 EJJCPOMDJHAN.eD 49F6B74: 65 72 00 51410 6 65 74 20 45C 78 70 6E riverData=C:Win 7F56C4: 3 4F 00 00 00C 51390 0 67 5 00 00D 00 00 00C 50 01 ডাউসসিস্টেম5Dr 00F00D00: 00 00 00 513 0 45C 4 4 43 50 4 4 44 4D 48D : 41 4 00 65 00F 44 00 513 0 72D 69 76 65 72 44 61F .EFC_74=61.FPS_ 3F43F3: 5 57 69F 6 00 513 0 64F 6 77 73 5F 53 79 73F 74 BROWSER_APP_PROF 65F6:33 E 32 5D 44 72E 32 00 513 ILE_STRING=Inter 0F69: 76E 65 72 73 5 44 72 69C 76D 65 72 44D AC 61B 74 61 নেট ExplM..MK। প্রধান() থেকে প্রস্থান করার জন্য [ENTER] এর জন্য অপেক্ষা করা হচ্ছে... C:UsersduckKEYPASS>
এই দৌড়ে, আমরা কোনও প্রক্রিয়া মেমরি ডাম্প দখল করতে বিরক্ত করিনি, কারণ আমরা আউটপুট থেকে সরাসরি দেখতে পাচ্ছি যে এই কোড ডেটা ফাঁস করে।
উইন্ডোজ সি রানটাইম লাইব্রেরি ফাংশন কল করার পরে malloc()
, আমরা দেখতে পাচ্ছি যে আমরা যে বাফারটি ফিরে পেয়েছি তাতে প্রোগ্রামের স্টার্টআপ কোড থেকে অবশিষ্ট পরিবেশ পরিবর্তনশীল ডেটার মতো দেখায়, প্রথম 16 বাইটগুলি দৃশ্যত বাম-ওভার মেমরি বরাদ্দ শিরোনামের মতো দেখতে পরিবর্তন করা হয়েছে৷
(মনে রাখবেন কিভাবে সেই 16 বাইট দুটি 8-বাইট মেমরি ঠিকানার মত দেখায়, 0xF55790
এবং 0xF50150
, যা যথাক্রমে আমাদের নিজস্ব মেমরি বাফারের ঠিক পরে এবং ঠিক আগে।)
যখন পাসওয়ার্ডটি মেমরিতে থাকার কথা, আমরা বাফারে সম্পূর্ণ স্ট্রিংটি পরিষ্কারভাবে দেখতে পারি, যেমনটি আমরা আশা করি।
কিন্তু ফোন করার পর free()
, লক্ষ্য করুন কীভাবে আমাদের বাফারের প্রথম 16 বাইটগুলি আবার কাছের মেমরি অ্যাড্রেসগুলির মতো দেখতে আবার লেখা হয়েছে, সম্ভবত তাই মেমরি বরাদ্দকারী মেমরিতে ব্লকগুলির ট্র্যাক রাখতে পারে যা এটি পুনরায় ব্যবহার করতে পারে...
…কিন্তু আমাদের "বিলুপ্ত করা" পাসওয়ার্ডের বাকি অংশ (শেষ 12টি এলোমেলো অক্ষর৷ EJJCPOMDJHAN
) পিছনে ফেলে রাখা হয়েছে।
আমাদের শুধুমাত্র সি-তে আমাদের নিজস্ব মেমরি বরাদ্দ এবং ডি-অ্যালোকেশন পরিচালনা করতে হবে না, আমাদের নিশ্চিত করতে হবে যে আমরা ডেটা বাফারগুলির জন্য সঠিক সিস্টেম ফাংশনগুলি বেছে নিতে চাই যদি আমরা সেগুলিকে সুনির্দিষ্টভাবে নিয়ন্ত্রণ করতে চাই।
উদাহরণস্বরূপ, পরিবর্তে এই কোডে স্যুইচ করার মাধ্যমে, আমরা মেমরিতে যা আছে তার উপর একটু বেশি নিয়ন্ত্রণ পাই:
থেকে স্যুইচ করে malloc()
এবং free()
নিম্ন-স্তরের উইন্ডোজ অ্যালোকেশন ফাংশন ব্যবহার করতে VirtualAlloc()
এবং VirtualFree()
সরাসরি, আমরা আরও ভাল নিয়ন্ত্রণ পাই।
যাইহোক, আমরা গতিতে একটি মূল্য দিতে, কারণ প্রতিটি কল VirtualAlloc()
একটি কল যে আরো কাজ করে malloc()
, যা পূর্ব-বরাদ্দ নিম্ন-স্তরের মেমরির একটি ব্লককে ক্রমাগত বিভাজন এবং উপবিভাজন করে কাজ করে।
ব্যবহার VirtualAlloc()
বারবার ছোট ব্লকের জন্যও সামগ্রিকভাবে আরও বেশি মেমরি ব্যবহার করা হয়, কারণ প্রতিটি ব্লকের দ্বারা আলাদা করা হয় VirtualAlloc()
সাধারণত 4KB মেমরির একাধিক ব্যবহার করে (বা 2MB, যদি আপনি তথাকথিত ব্যবহার করেন বড় মেমরি পাতা), যাতে উপরের আমাদের 128-বাইট বাফারটি 4096 বাইট পর্যন্ত রাউন্ড করা হয়, 3968KB মেমরি ব্লকের শেষে 4 বাইট নষ্ট করে।
কিন্তু, আপনি দেখতে পাচ্ছেন, আমরা যে মেমরি ফিরে পাই তা স্বয়ংক্রিয়ভাবে ফাঁকা হয়ে যায় (শূন্যে সেট), তাই আগে কী ছিল তা আমরা দেখতে পাই না, এবং এইবার যখন আমরা আমাদের ব্যবহার-পর-মুক্ত করার চেষ্টা করি তখন প্রোগ্রামটি ক্র্যাশ হয়ে যায়। কৌশল, কারণ উইন্ডোজ সনাক্ত করে যে আমরা মেমরিতে উঁকি দেওয়ার চেষ্টা করছি আমাদের আর মালিকানা নেই:
C:UsersduckKEYPASS> unl2 ডাম্পিং 'নতুন' বাফার শুরুতে 0000000000EA0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 0010 00 00 00 00 00 00 00: 00 00 00 00 00 00 00 00 00 0000000000 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00. .............. 00EA0000000000: 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 0040 00 00 ... 00 00 ................00EA00: 00 00 00 00 00 00 00 00 00 00 0000000000 0050 00 00EA00: 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 0060 00 ................. সম্পূর্ণ স্ট্রিংটি ছিল: unlikelytextIBIPJPPHEOPOIDLL 00EA00: 00 00E 00C 00 00B 00 00C 00 00 00 00 00 00 0000000000 0070 00 P00A00BI অসম্ভাব্য পাঠ্য 00 00 00 00F 00 00F 00 00 00C 00C 00 00 00 0000000000 JPPHEOPOIDLL.... 0080EA00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 : 0000 75 6 6 69 6 65 6 79 74 65 78 74 49 42 49 50 ................. 0000000000................ 0010EA4: 50 50 48 45 4 50 4 49 44 4 4 00 00 ............... 00EA00: 0000000000 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 0030................................ 00EA00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000000000 ... বিনামূল্যে বাফারের জন্য [ENTER] এর জন্য অপেক্ষা করা হচ্ছে... free() 0040EA00 এর পরে বাফার ডাম্পিং: [প্রোগ্রাম এখানে বন্ধ করা হয়েছে কারণ উইন্ডোজ আমাদের ব্যবহার-পর-ফ্রি ধরেছে]
কারণ আমরা যে মেমরিটি খালি করেছি তার সাথে পুনরায় বরাদ্দ করতে হবে VirtualAlloc()
এটি পুনরায় ব্যবহার করার আগে, আমরা অনুমান করতে পারি যে এটি পুনর্ব্যবহৃত হওয়ার আগে এটি শূন্য হয়ে যাবে।
যাইহোক, যদি আমরা নিশ্চিত করতে চাই যে এটি খালি করা হয়েছে, আমরা বিশেষ উইন্ডোজ ফাংশনকে কল করতে পারি RtlSecureZeroMemory()
এটিকে মুক্ত করার ঠিক আগে, গ্যারান্টি দেওয়ার জন্য যে উইন্ডোজ আমাদের বাফারে প্রথমে শূন্য লিখবে।
সম্পর্কিত ফাংশন RtlZeroMemory()
, যদি আপনি ভাবছিলেন, একই রকম কাজ করে, কিন্তু আসলে কাজ করার গ্যারান্টি ছাড়াই, কারণ কম্পাইলারদের তাত্ত্বিকভাবে অপ্রয়োজনীয় হিসাবে এটি অপসারণ করার অনুমতি দেওয়া হয় যদি তারা লক্ষ্য করে যে বাফারটি পরে আবার ব্যবহার করা হয়নি।
আপনি দেখতে পাচ্ছেন, আমাদের সঠিক উইন্ডোজ ফাংশনগুলি ব্যবহার করার জন্য যথেষ্ট যত্ন নিতে হবে যদি আমরা মেমরিতে সঞ্চিত গোপনীয়তাগুলি পরবর্তীতে পড়ে থাকতে পারে তা কমাতে চাই।
এই নিবন্ধে, আমরা দেখব না যে আপনি কীভাবে গোপনীয়তাগুলিকে শারীরিক র্যামে লক করে আপনার সোয়াপ ফাইলে দুর্ঘটনাক্রমে সংরক্ষিত হওয়া রোধ করবেন। (ইঙ্গিত: VirtualLock()
আসলে নিজে থেকে যথেষ্ট নয়।) আপনি যদি নিম্ন-স্তরের উইন্ডোজ মেমরি নিরাপত্তা সম্পর্কে আরও জানতে চান, তাহলে মন্তব্যে আমাদের জানান এবং আমরা ভবিষ্যতের নিবন্ধে এটি দেখব।
স্বয়ংক্রিয় মেমরি ব্যবস্থাপনা ব্যবহার করে
নিজেরাই মেমরি বরাদ্দ, পরিচালনা এবং ডিলোকেট করা এড়াতে একটি সুন্দর উপায় হল একটি প্রোগ্রামিং ভাষা ব্যবহার করা যা যত্ন নেয় malloc()
এবং free()
, বা VirtualAlloc()
এবং VirtualFree()
স্বয়ংক্রিয়ভাবে।
স্ক্রিপ্টিং ভাষা যেমন পার্ল, পাইথন, গ্রহণ করা, জাভাস্ক্রিপ্ট এবং অন্যরা ব্যাকগ্রাউন্ডে আপনার জন্য মেমরির ব্যবহার ট্র্যাক করার মাধ্যমে C এবং C++ কোডগুলিকে প্লেগ করে এমন সবচেয়ে সাধারণ মেমরি সেফটি বাগগুলি থেকে মুক্তি পায়৷
আমরা আগেই বলেছি, উপরের আমাদের খারাপভাবে লেখা নমুনা সি কোডটি এখন ঠিক কাজ করে, কিন্তু শুধুমাত্র কারণ এটি এখনও একটি অতি-সাধারণ প্রোগ্রাম, নির্দিষ্ট আকারের ডেটা স্ট্রাকচার সহ, যেখানে আমরা পরিদর্শন করে যাচাই করতে পারি যে আমরা আমাদের 128-কে ওভাররাইট করব না। বাইট বাফার, এবং যে শুধুমাত্র একটি মৃত্যুদন্ডের পথ আছে যা দিয়ে শুরু হয় malloc()
এবং একটি সংশ্লিষ্ট দিয়ে শেষ হয় free()
.
কিন্তু যদি আমরা পরিবর্তনশীল-দৈর্ঘ্যের পাসওয়ার্ড তৈরির অনুমতি দেওয়ার জন্য এটি আপডেট করি, বা প্রজন্মের প্রক্রিয়াতে অতিরিক্ত বৈশিষ্ট্য যোগ করি, তাহলে আমরা (বা পরবর্তী কোডটি যে কেউ বজায় রাখবে) সহজেই বাফার ওভারফ্লো, ব্যবহারের পর-মুক্ত বাগ, বা মেমরির সাথে শেষ হতে পারি যা কখনই মুক্ত হয় না এবং সেইজন্য গোপন ডেটা দীর্ঘক্ষণ ঝুলিয়ে রাখে পরে এটির আর প্রয়োজন হয় না।
লুয়ার মতো একটি ভাষায়, আমরা লুয়াকে রান-টাইম এনভায়রনমেন্ট করতে দিতে পারি, যা জার্গনে যা পরিচিত তা করে স্বয়ংক্রিয় আবর্জনা সংগ্রহ, সিস্টেম থেকে মেমরি অর্জনের সাথে মোকাবিলা করুন এবং যখন এটি সনাক্ত করে যে আমরা এটি ব্যবহার করা বন্ধ করে দিয়েছি তখন এটি ফেরত দেওয়া।
আমরা উপরে তালিকাভুক্ত সি প্রোগ্রামটি খুব সহজ হয়ে যায় যখন আমাদের জন্য মেমরি বরাদ্দ এবং ডি-অ্যালোকেশনের যত্ন নেওয়া হয়:
আমরা স্ট্রিং রাখা মেমরি বরাদ্দ s
শুধু স্ট্রিং বরাদ্দ করে 'unlikelytext'
এটা থেকে
আমরা পরে লুয়াকে স্পষ্টভাবে ইঙ্গিত করতে পারি যে আমরা আর আগ্রহী নই s
এটি মান নির্ধারণ করে nil
(সমস্ত nils
মূলত একই Lua অবজেক্ট), অথবা ব্যবহার বন্ধ করুন s
এবং লুয়ার জন্য অপেক্ষা করুন যে এটির আর প্রয়োজন নেই।
যে কোন উপায়ে, দ্বারা ব্যবহৃত মেমরি s
অবশেষে স্বয়ংক্রিয়ভাবে পুনরুদ্ধার করা হবে।
এবং টেক্সট স্ট্রিংগুলিতে যুক্ত করার সময় বাফার ওভারফ্লো বা আকারের অব্যবস্থাপনা রোধ করতে (লুয়া অপারেটর ..
, উচ্চারণ কনক্যাট, মূলত দুটি স্ট্রিং একসাথে যোগ করে, যেমন +
পাইথনে), প্রতিবার যখন আমরা একটি স্ট্রিং প্রসারিত বা ছোট করি, লুয়া জাদুকরীভাবে একটি নতুন স্ট্রিংয়ের জন্য জায়গা বরাদ্দ করে, আসলটিকে তার বিদ্যমান মেমরি অবস্থানে পরিবর্তন বা প্রতিস্থাপন না করে।
এই পদ্ধতিটি ধীরগতির, এবং পাঠ্য ম্যানিপুলেশনের সময় বরাদ্দ করা মধ্যবর্তী স্ট্রিংগুলির কারণে আপনি C-তে যা পেতে চান তার চেয়ে বেশি মেমরি ব্যবহারের শিখরে নিয়ে যায়, তবে বাফার ওভারফ্লোগুলির ক্ষেত্রে এটি অনেক বেশি নিরাপদ।
কিন্তু এই ধরণের স্বয়ংক্রিয় স্ট্রিং ম্যানেজমেন্ট (জার্গন হিসাবে পরিচিত অপরিবর্তনীয়তা, কারণ স্ট্রিং পেতে না পরিবর্তিত, বা জায়গায় সংশোধিত, একবার সেগুলি তৈরি হয়ে গেলে), এর নিজস্ব সাইবারসিকিউরিটি মাথাব্যথা নিয়ে আসে।
আমরা উইন্ডোজে উপরের লুয়া প্রোগ্রামটি চালিয়েছি, প্রোগ্রামটি প্রস্থান করার ঠিক আগে দ্বিতীয় বিরতি পর্যন্ত:
C:UsersduckKEYPASS> lua s1.lua সম্পূর্ণ স্ট্রিং হল: unlikelytextHLKONBOJILAGLNLN স্ট্রিং মুক্ত করার আগে [ENTER] এর জন্য অপেক্ষা করা হচ্ছে... প্রস্থান করার আগে [ENTER] এর জন্য অপেক্ষা করা হচ্ছে...
এইবার, আমরা একটি প্রক্রিয়া মেমরি ডাম্প নিয়েছি, এইরকম:
C:UsersduckKEYPASS> procdump -ma lua lua-s1.dmp ProcDump v11.0 - Sysinternals প্রসেস ডাম্প ইউটিলিটি কপিরাইট (C) 2009-2022 মার্ক রুসিনোভিচ এবং অ্যান্ড্রু রিচার্ডস সিসিনটার্নালস - www.sysinternals.com: [00]00mp শুরু করা হয়েছে: C:UsersduckKEYPASSlua-s00.dmp [1:1:00] ডাম্প 00 লেখা: আনুমানিক ডাম্প ফাইলের আকার 00 এমবি। [1:10:00] ডাম্প 00 সম্পূর্ণ: 00 সেকেন্ডে 1 MB লেখা [10:0.1:00] ডাম্প সংখ্যা পৌঁছেছে৷
তারপরে আমরা এই সহজ স্ক্রিপ্টটি চালালাম, যা ডাম্প ফাইলটি আবার পড়ে, মেমরিতে সর্বত্র খুঁজে পায় যে পরিচিত স্ট্রিং unlikelytext
উপস্থিত হয়, এবং ডাম্পফাইলে এর অবস্থান এবং অবিলম্বে অনুসরণ করা ASCII অক্ষরগুলির সাথে এটি মুদ্রণ করে:
এমনকি যদি আপনি আগে স্ক্রিপ্ট ভাষা ব্যবহার করে থাকেন, বা এমন কোনো প্রোগ্রামিং ইকোসিস্টেমে কাজ করেন যা তথাকথিত বৈশিষ্ট্যযুক্ত পরিচালিত স্ট্রিং, যেখানে সিস্টেম আপনার জন্য মেমরি বরাদ্দ এবং ডিললোকেশনের ট্র্যাক রাখে এবং উপযুক্ত মনে করে সেগুলি পরিচালনা করে...
…এই মেমরি স্ক্যানটি যে আউটপুট তৈরি করে তা দেখে আপনি অবাক হতে পারেন:
C:UsersduckKEYPASS> lua findit.lua lua-s1.dmp 006D8AFC: unlikelytextALJBNGOAPLLBDEB 006D8B3C: unlikelytextALJBNGOA 006D8B7C: unlikelytextALJBNGO 006Dlyapcdbcd8Btext:BLLBJFC unlikelytextALJBN 006D8D006C: unlikelytextALJBNGOAP 8D7C: unlikelytextALJBNGOAPL 006D903BC: unlikelytextALJBNGOAPLL 006D90FC: unlikelytextALJBNG 006D90C: unlikelytextALJBNG 006D913C: unlikelytextALJBNGOAP 006D91C: unlikelytextALJBNGOAP B 006D91FC: unlikelytextALJBNGOAPLLBD 006D923C : unlikelytextALJBNGOAPLLBDE 006DB70C: unlikelytextALJ 006DBB8C: unlikelytextAL 006DBD0C: unlikelytextA
দেখুন এবং দেখুন, সেই সময়ে আমরা আমাদের মেমরি ডাম্প ধরলাম, যদিও আমরা স্ট্রিং দিয়ে শেষ করেছি s
(এবং লুয়াকে বলেছিল যে আমাদের আর এটার দরকার নেই s = nil
, পথ ধরে কোড তৈরি করা সমস্ত স্ট্রিং এখনও RAM-তে উপস্থিত ছিল, এখনও পুনরুদ্ধার বা মুছে ফেলা হয়নি।
প্রকৃতপক্ষে, যদি আমরা উপরের আউটপুটগুলিকে স্ট্রিংগুলির দ্বারা সাজাই, র্যামে যে ক্রমানুসারে তারা উপস্থিত হয়েছিল তা অনুসরণ না করে, আপনি লুপের সময় কী ঘটেছিল তা চিত্রিত করতে সক্ষম হবেন যেখানে আমরা আমাদের পাসওয়ার্ড স্ট্রিংটিতে একবারে একটি অক্ষর সংযুক্ত করেছি:
C:UsersduckKEYPASS> lua findit.lua lua-s1.dmp | বাছাই /+10 006DBD0C: unlikelytextA 006DBB8C: unlikelytextAL 006DB70C: unlikelytextALJ 006D91BC: unlikelytextALJB 006D8CBC: unlikelytextALJBN 006D90FC: unlikelyBCDALNGALGO006FC: unlikelyBCDALGNG8TX 7D006B8C: unlikelytextALJBNGOA 3D006D8C: unlikelytextALJBNGOAP 7D006C: unlikelytextALJBNGOAPL 903D006BC: unlikelytextALJBNGOAPLL 90D006C: unlikelytextALJBNGOAPLL 913D006C: unlikelytextALJBNGOALL91D006C: unlikelytextALJBNGOALL923A D 006D8C: unlikelytextALJBNGOAPLLBDE 006D8AFC: unlikelytextALJBNGOAPLLBDEB XNUMXDXNUMXBFC : অসম্ভাব্য টেক্সটALJBNGOAPLLBDEBJ
এই সমস্ত অস্থায়ী, মধ্যবর্তী স্ট্রিংগুলি এখনও সেখানে রয়েছে, তাই আমরা সফলভাবে এর চূড়ান্ত মানটি মুছে ফেললেও s
, আমরা এখনও তার শেষ চরিত্র ছাড়া সবকিছু ফাঁস করা হবে.
আসলে, এই ক্ষেত্রে, এমনকি যখন আমরা ইচ্ছাকৃতভাবে আমাদের প্রোগ্রামটিকে বিশেষ লুয়া ফাংশন কল করে সমস্ত অপ্রয়োজনীয় ডেটা নিষ্পত্তি করতে বাধ্য করেছি। collectgarbage()
(অধিকাংশ স্ক্রিপ্টিং ল্যাঙ্গুয়েজের একই রকম কিছু থাকে), সেই কষ্টকর অস্থায়ী স্ট্রিংগুলির বেশিরভাগ ডেটা যাইহোক RAM-তে আটকে থাকে, কারণ আমরা লুয়াকে কম্পাইল করেছি ভাল পুরানো ব্যবহার করে স্বয়ংক্রিয় মেমরি পরিচালনা করতে malloc()
এবং free()
.
অন্য কথায়, লুয়া নিজেই তার অস্থায়ী মেমরি ব্লকগুলিকে পুনরায় ব্যবহার করার জন্য পুনরুদ্ধার করার পরেও, আমরা নিয়ন্ত্রণ করতে পারিনি কিভাবে বা কখন সেই মেমরি ব্লকগুলি পুনরায় ব্যবহার করা হবে, এবং এইভাবে কতক্ষণ তারা তাদের বাম সাথে প্রক্রিয়ার ভিতরে শুয়ে থাকবে- অপেক্ষমাণ ডাটা অপেক্ষমাণ আউট, ডাম্প, বা অন্যথায় ফাঁস.
.NET লিখুন
কিন্তু KeePass সম্পর্কে কি, যেখানে এই নিবন্ধটি শুরু হয়েছিল?
KeePass C# এ লেখা, এবং .NET রানটাইম ব্যবহার করে, তাই এটি মেমরির অব্যবস্থাপনার সমস্যাগুলি এড়ায় যা C প্রোগ্রামগুলি তাদের সাথে নিয়ে আসে...
…কিন্তু C# তার নিজস্ব টেক্সট স্ট্রিংগুলি পরিচালনা করে, লুয়ার মতো, যা প্রশ্ন উত্থাপন করে:
এমনকি যদি প্রোগ্রামার পুরো মাস্টার পাসওয়ার্ডটি শেষ করার পরে একটি জায়গায় সংরক্ষণ করা এড়িয়ে যায়, তবে আক্রমণকারীরা একটি মেমরি ডাম্প অ্যাক্সেস করতে পারে তবুও মাস্টার পাসওয়ার্ডটি অনুমান করতে বা পুনরুদ্ধার করার জন্য পর্যাপ্ত অবশিষ্ট অস্থায়ী ডেটা খুঁজে পেতে পারে, এমনকি যদি সেগুলি আপনি পাসওয়ার্ড টাইপ করার পরে আক্রমণকারীরা আপনার কম্পিউটারে মিনিট, ঘন্টা বা কয়েকদিনের অ্যাক্সেস পেয়েছে?
সহজ কথায়, আপনার মাস্টার পাসওয়ার্ডের শনাক্তযোগ্য, ভৌতিক অবশিষ্টাংশ আছে যা RAM-তে টিকে আছে, এমনকি আপনি সেগুলি অপসারণ করার আশা করার পরেও?
বিরক্তিকরভাবে, Github ব্যবহারকারী হিসাবে Vdohney আবিষ্কার, উত্তর (কমপক্ষে 2.54 এর আগে KeePass সংস্করণের জন্য) হল, "হ্যাঁ।"
স্পষ্ট করে বলতে গেলে, আমরা মনে করি না যে আপনার আসল মাস্টার পাসওয়ার্ডটি KeePass মেমরি ডাম্প থেকে একটি একক পাঠ্য স্ট্রিং হিসাবে পুনরুদ্ধার করা যেতে পারে, কারণ লেখক মাস্টার পাসওয়ার্ড এন্ট্রির জন্য একটি বিশেষ ফাংশন তৈরি করেছেন যা সম্পূর্ণ সংরক্ষণ এড়াতে তার পথের বাইরে চলে যায়। পাসওয়ার্ড যেখানে এটি সহজেই দেখা যায় এবং শুঁকে যায়।
আমাদের মাস্টার পাসওয়ার্ড সেট করে আমরা এতে নিজেদের সন্তুষ্ট করেছি SIXTEENPASSCHARS
, এটি টাইপ করা, এবং তারপর মেমরি ডাম্প নেওয়া অবিলম্বে, শীঘ্রই, এবং অনেক পরে।
আমরা একটি সাধারণ লুয়া স্ক্রিপ্ট দিয়ে ডাম্পগুলি অনুসন্ধান করেছি যা 8-বিট ASCII ফর্ম্যাটে এবং 16-বিট UTF-16 (উইন্ডোজ ওয়াইডচার) ফর্ম্যাটে, এইরকম:
ফলাফলগুলি উত্সাহজনক ছিল:
C:UsersduckKEYPASS> lua searchknown.lua kp2-post.dmp ডাম্প ফাইলে পড়া... সম্পন্ন। 8-বিট ASCII হিসাবে SIXTEENPASSCHARS অনুসন্ধান করা হচ্ছে... পাওয়া যায়নি। UTF-16 হিসাবে SIXTEENPASSCHARS অনুসন্ধান করা হচ্ছে... পাওয়া যায়নি।
কিন্তু Vdohney, CVE-2023-32784-এর আবিষ্কারক, লক্ষ্য করেছেন যে আপনি আপনার মাস্টার পাসওয়ার্ড টাইপ করার সাথে সাথে, KeePass ইউনিকোড "ব্লব" অক্ষর সমন্বিত একটি স্থানধারক স্ট্রিং তৈরি এবং প্রদর্শন করে আপনাকে চাক্ষুষ প্রতিক্রিয়া দেয়, আপনার দৈর্ঘ্য পর্যন্ত এবং সহ পাসওয়ার্ড:
উইন্ডোজের ওয়াইডচার টেক্সট স্ট্রিংগুলিতে (যা প্রতি অক্ষর দুটি বাইট নিয়ে গঠিত, ASCII-এর মতো প্রতিটি বাইট নয়), "ব্লব" অক্ষরটি হেক্স বাইট হিসাবে র্যামে এনকোড করা হয়। 0xCF
দ্বারা অনুসরণ 0x25
(যা শুধু ASCII-তে একটি শতাংশ চিহ্ন হতে পারে)।
সুতরাং, আপনি পাসওয়ার্ডটি প্রবেশ করার সময় আপনার টাইপ করা কাঁচা অক্ষরগুলির সাথে KeePass খুব যত্ন নিলেও, আপনি "ব্লব" অক্ষরের বাম-ওভার স্ট্রিংগুলির সাথে শেষ হতে পারেন, যা বারবার চালানোর মতো মেমরিতে সহজেই সনাক্ত করা যায় CF25CF25
or CF25CF25CF25
...
…এবং, যদি তাই হয়, আপনার পাওয়া ব্লব অক্ষরগুলির দীর্ঘতম দৌড় সম্ভবত আপনার পাসওয়ার্ডের দৈর্ঘ্য প্রদান করবে, যা অন্য কিছু না হলে পাসওয়ার্ড তথ্য ফাঁসের একটি শালীন রূপ হবে।
বাম-ওভার পাসওয়ার্ড প্লেসহোল্ডার স্ট্রিংগুলির লক্ষণগুলি সন্ধান করতে আমরা নিম্নলিখিত লুয়া স্ক্রিপ্টটি ব্যবহার করেছি:
আউটপুটটি আশ্চর্যজনক ছিল (স্থান বাঁচাতে আমরা একই সংখ্যক ব্লব, বা আগের লাইনের চেয়ে কম ব্লব সহ ধারাবাহিক লাইনগুলি মুছে ফেলেছি):
C:UsersduckKEYPASS> lua findblobs.lua kp2-post.dmp 000EFF3C: * [. . .] 00BE621B: ** 00BE64C7: *** [. . .] 00BE6E8F: **** [. . .] 00BE795F: ***** [. . .] 00BE84F7: ****** [. . | *** 00C8: **************** 37C8: * 9C16: * [ বাকি সব ম্যাচ এক ব্লব লম্বা] 00B0503: *
কাছাকাছি-একসাথে কিন্তু ক্রমাগত ক্রমবর্ধমান মেমরি ঠিকানাগুলিতে, আমরা 3টি ব্লব, তারপর 4টি ব্লব, এবং আরও 16টি ব্লব (আমাদের পাসওয়ার্ডের দৈর্ঘ্য) এর একটি পদ্ধতিগত তালিকা পেয়েছি, যার পরে একক-ব্লব স্ট্রিংগুলির অনেকগুলি এলোমেলোভাবে বিক্ষিপ্ত উদাহরণ রয়েছে৷ .
সুতরাং, সেই প্লেসহোল্ডার "ব্লব" স্ট্রিংগুলি সত্যিই মনে হচ্ছে মেমরিতে ফাঁস হয়ে যাচ্ছে এবং পাসওয়ার্ডের দৈর্ঘ্য ফাঁস করার পিছনে রয়ে গেছে, KeePass সফ্টওয়্যারটি আপনার মাস্টার পাসওয়ার্ড দিয়ে শেষ করার অনেক পরে।
পরবর্তী ধাপ হল
আমরা আরও খনন করার সিদ্ধান্ত নিয়েছি, ঠিক যেমন Vdohney করেছিল।
16-বিট ফরম্যাটে যেকোন একক ASCII অক্ষর অনুসরণ করে ব্লব অক্ষরের চেইন সনাক্ত করতে আমরা আমাদের প্যাটার্ন ম্যাচিং কোড পরিবর্তন করেছি (ASCII অক্ষরগুলিকে UTF-16-এ তাদের স্বাভাবিক 8-বিট ASCII কোড হিসাবে উপস্থাপন করা হয়, তারপরে একটি শূন্য বাইট)।
এইবার, স্থান বাঁচাতে, আমরা আগেরটির সাথে হুবহু মেলে এমন যেকোনো ম্যাচের আউটপুট দমন করেছি:
চমক চমক:
C:UsersduckKEYPASS> lua searchkp.lua kp2-post.dmp 00BE581B: *I 00BE621B: **X 00BE6BD3: ***T 00BE769B: ****E 00BE822B: *****E 00BE8C6B: ******N 00BE974B: *******P 00BEA25B: ********A 00BEAD33: *********S 00BEB81B: **********S 00BEC383: ***********C 00BECEEB: ************H 00BEDA5B: *************A 00BEE623: **************R 00BEF1A3: ***************S 03E97CF2: *N 0AA6F0AF: *W 0D8AF7C8: *X 0F27BAF8: *S
দেখুন আমরা .NET এর পরিচালিত স্ট্রিং মেমরি অঞ্চল থেকে কী পেতে পারি!
অস্থায়ী "ব্লব স্ট্রিং" এর একটি ঘনিষ্ঠভাবে গুচ্ছ করা সেট যা দ্বিতীয় অক্ষর থেকে শুরু করে আমাদের পাসওয়ার্ডের ধারাবাহিক অক্ষরগুলি প্রকাশ করে৷
এই ফাঁস হওয়া স্ট্রিংগুলি ব্যাপকভাবে বিতরণ করা একক-অক্ষরের মিলগুলির দ্বারা অনুসরণ করা হয় যা আমরা দৈবক্রমে উত্থিত বলে ধরে নিই। (একটি KeePass ডাম্প ফাইলের আকার প্রায় 250MB, তাই "ব্লব" অক্ষরগুলি ভাগ্যের মতো প্রদর্শিত হওয়ার জন্য প্রচুর জায়গা রয়েছে।)
এমনকি যদি আমরা সেই অতিরিক্ত চারটি ম্যাচকে বিবেচনায় রাখি, তাদের সম্ভাব্য অমিল হিসাবে বাদ না দিয়ে, আমরা অনুমান করতে পারি যে মাস্টার পাসওয়ার্ডটি হল:
?XTEENPASSHARS ?NXTEENPASSHARS ?WXTEENPASSHARS ?XTEENPASSHARS
স্পষ্টতই, এই সহজ কৌশলটি পাসওয়ার্ডে প্রথম অক্ষরটি খুঁজে পায় না, কারণ প্রথম "ব্লব স্ট্রিং" শুধুমাত্র প্রথম অক্ষরটি টাইপ করার পরেই তৈরি করা হয়।
মনে রাখবেন যে এই তালিকাটি সুন্দর এবং সংক্ষিপ্ত কারণ আমরা ASCII অক্ষরে শেষ না হওয়া ম্যাচগুলিকে ফিল্টার করেছি৷
আপনি যদি চাইনিজ বা কোরিয়ান অক্ষরের মতো ভিন্ন পরিসরে অক্ষর খুঁজছেন, তাহলে আপনি হয়ত আরো দুর্ঘটনাজনিত হিট পেতে পারেন, কারণ এর সাথে মেলাতে অনেক বেশি সম্ভাব্য অক্ষর রয়েছে...
…কিন্তু আমরা সন্দেহ করি যে যাইহোক আপনি আপনার মাস্টার পাসওয়ার্ডের খুব কাছাকাছি পৌঁছে যাবেন, এবং পাসওয়ার্ডের সাথে সম্পর্কিত "ব্লব স্ট্রিংগুলি" র্যামে একসাথে গ্রুপ করা হয়েছে বলে মনে হচ্ছে, সম্ভবত কারণ সেগুলি প্রায় একই সময়ে একই অংশ দ্বারা বরাদ্দ করা হয়েছিল .NET রানটাইম।
এবং সেখানে, একটি স্বীকার্যভাবে দীর্ঘ এবং বিতর্কমূলক সংক্ষেপে, এর আকর্ষণীয় গল্প জন্য CVE-2023-32784.
কি করো?
- আপনি যদি একজন KeePass ব্যবহারকারী হন, তাহলে আতঙ্কিত হবেন না। যদিও এটি একটি বাগ, এবং প্রযুক্তিগতভাবে একটি শোষণযোগ্য দুর্বলতা, দূরবর্তী আক্রমণকারীরা যারা এই বাগটি ব্যবহার করে আপনার পাসওয়ার্ড ক্র্যাক করতে চেয়েছিল তাদের প্রথমে আপনার কম্পিউটারে ম্যালওয়্যার স্থাপন করতে হবে৷ এটি তাদের সরাসরি আপনার পাসওয়ার্ড চুরি করার আরও অনেক উপায় দেবে, এমনকি যদি এই বাগটি বিদ্যমান না থাকে, উদাহরণস্বরূপ আপনি টাইপ করার সাথে সাথে আপনার কীস্ট্রোকগুলি লগ করে৷ এই মুহুর্তে, আপনি কেবল আসন্ন আপডেটের জন্য নজর রাখতে পারেন এবং এটি প্রস্তুত হলে এটি দখল করতে পারেন।
- আপনি যদি পূর্ণ-ডিস্ক এনক্রিপশন ব্যবহার না করেন, তাহলে এটি সক্ষম করার কথা বিবেচনা করুন। আপনার সোয়াপ ফাইল বা হাইবারনেশন ফাইল (অপারেটিং সিস্টেম ডিস্ক ফাইলগুলি অস্থায়ীভাবে ভারী লোডের সময় বা আপনার কম্পিউটার যখন "স্লিপিং" অবস্থায় মেমরি বিষয়বস্তু সংরক্ষণ করতে ব্যবহৃত হয়) থেকে বাম-ওভার পাসওয়ার্ডগুলি বের করতে, আক্রমণকারীদের আপনার হার্ড ডিস্কে সরাসরি অ্যাক্সেসের প্রয়োজন হবে। আপনার যদি BitLocker বা অন্যান্য অপারেটিং সিস্টেমের জন্য এর সমতুল্য সক্রিয় থাকে, তাহলে তারা আপনার সোয়াপ ফাইল, আপনার হাইবারনেশন ফাইল বা অন্য কোনো ব্যক্তিগত ডেটা যেমন নথি, স্প্রেডশীট, সংরক্ষিত ইমেল ইত্যাদি অ্যাক্সেস করতে পারবে না।
- আপনি যদি একজন প্রোগ্রামার হন তবে মেমরি ব্যবস্থাপনার সমস্যা সম্পর্কে নিজেকে অবগত রাখুন। যে অনুমান করবেন না শুধুমাত্র কারণ প্রতিটি
free()
তার অনুরূপ মেলেmalloc()
আপনার ডেটা নিরাপদ এবং ভালভাবে পরিচালিত হয়। কখনও কখনও, গোপন ডেটা আশেপাশে পড়ে থাকা এড়াতে আপনাকে অতিরিক্ত সতর্কতা অবলম্বন করতে হতে পারে এবং সেই সতর্কতাগুলি অপারেটিং সিস্টেম থেকে অপারেটিং সিস্টেম পর্যন্ত। - আপনি যদি একজন QA পরীক্ষক বা কোড পর্যালোচক হন তবে সর্বদা "পর্দার পিছনে" ভাবুন। এমনকি মেমরি ম্যানেজমেন্ট কোড পরিপাটি এবং সু-ভারসাম্যপূর্ণ দেখালেও, পর্দার আড়ালে কী ঘটছে সে সম্পর্কে সচেতন থাকুন (কারণ মূল প্রোগ্রামার হয়তো এটি করতে জানেন না), এবং রানটাইম পর্যবেক্ষণ এবং মেমরির মতো কিছু পেন্টেস্টিং-স্টাইলের কাজ করার জন্য প্রস্তুত হন। নিরাপদ কোডটি যাচাই করার জন্য ডাম্পিং আসলেই আচরণ করছে যেমনটি অনুমিত হয়।
নিবন্ধ থেকে কোড: UNL1.C
#অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত অকার্যকর হেক্সডাম্প (আনসাইন করা চার* বাফ, int লেন) { // (int i = 16; i < len+0; i = i+16) { printf("%16X: ", buff) এর জন্য 016-বাইট খণ্ডে বাফার প্রিন্ট করুন +i); // হেক্স মান হিসেবে 16 বাইট দেখান (int j = 0; j < 16; j = j+1) { printf("%02X", buff[i+j]); } // (int j = 16; j < 0; j = j+16) { আনসাইনড ch = buff[i+j]; printf("%c",(ch>=1 && ch<=32)?ch:'.'); } printf("n"); } printf("n"); } int main(void) { // পাসওয়ার্ড সংরক্ষণ করতে মেমরি অর্জন করুন, এবং বাফারে কী আছে তা দেখান যখন এটি আনুষ্ঠানিকভাবে "নতুন"... char* buff = malloc(127); printf("শুরুতে 'নতুন' বাফার ডাম্পিং"); হেক্সডাম্প(বাফ,128); // এলোমেলো বীজ srand(( স্বাক্ষরবিহীন) বাফ হিসাবে pseudorandom বাফার ঠিকানা ব্যবহার করুন; // কিছু নির্দিষ্ট, অনুসন্ধানযোগ্য পাঠ্য strcpy(buff,"unlikelytext") দিয়ে পাসওয়ার্ড শুরু করুন; // (int i = 128; i <= 16; i++) { // A (1+16) থেকে P (65+0) char ch = 65 + এর জন্য 15 টি সিউডোর্যান্ডম অক্ষর যোগ করুন। (rand() & 65); // তারপর strncat(buff,&ch,15) জায়গায় বাফ স্ট্রিং পরিবর্তন করুন; } // সম্পূর্ণ পাসওয়ার্ডটি এখন মেমরিতে রয়েছে, তাই // এটি একটি স্ট্রিং হিসাবে প্রিন্ট করুন এবং পুরো বাফারটি দেখান... printf("সম্পূর্ণ স্ট্রিং ছিল: %sn", buff); হেক্সডাম্প(বাফ,1); // এখনই প্রসেস RAM ডাম্প করতে বিরতি দিন (ট্রাই করুন: 'procdump -ma') রাখে("বাফার মুক্ত করতে [ENTER] এর জন্য অপেক্ষা করছে..."); getchar(); // আনুষ্ঠানিকভাবে মুক্ত() মেমরি এবং বাফার দেখান // আবার দেখুন কিছু পিছনে বাকি আছে কিনা... free(buff); printf("মুক্তির পরে বাফার ডাম্পিং()n"); হেক্সডাম্প(বাফ,128); // পার্থক্য পুট পরিদর্শন করতে আবার RAM ডাম্প করতে বিরাম দিন("প্রধান()..." থেকে প্রস্থান করার জন্য [ENTER] এর জন্য অপেক্ষা করা হচ্ছে); getchar(); রিটার্ন 128; }
নিবন্ধ থেকে কোড: UNL2.C
#অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত #অন্তর্ভুক্ত অকার্যকর হেক্সডাম্প (আনসাইন করা চার* বাফ, int লেন) { // (int i = 16; i < len+0; i = i+16) { printf("%16X: ", buff) এর জন্য 016-বাইট খণ্ডে বাফার প্রিন্ট করুন +i); // হেক্স মান হিসেবে 16 বাইট দেখান (int j = 0; j < 16; j = j+1) { printf("%02X", buff[i+j]); } // (int j = 16; j < 0; j = j+16) { আনসাইনড ch = buff[i+j]; printf("%c",(ch>=1 && ch<=32)?ch:'.'); } printf("n"); } printf("n"); } int main(void) { // পাসওয়ার্ড সংরক্ষণ করার জন্য মেমরি অর্জন করুন, এবং বাফারে কী আছে তা দেখান যখন এটি আনুষ্ঠানিকভাবে "নতুন"... char* buff = VirtualAlloc(127,MEM_COMMIT,PAGE_READWRITE); printf("শুরুতে 'নতুন' বাফার ডাম্পিং"); হেক্সডাম্প(বাফ,0,128); // এলোমেলো বীজ srand(( স্বাক্ষরবিহীন) বাফ হিসাবে pseudorandom বাফার ঠিকানা ব্যবহার করুন; // কিছু নির্দিষ্ট, অনুসন্ধানযোগ্য পাঠ্য strcpy(buff,"unlikelytext") দিয়ে পাসওয়ার্ড শুরু করুন; // (int i = 128; i <= 16; i++) { // A (1+16) থেকে P (65+0) char ch = 65 + এর জন্য 15 টি সিউডোর্যান্ডম অক্ষর যোগ করুন। (rand() & 65); // তারপর strncat(buff,&ch,15) জায়গায় বাফ স্ট্রিং পরিবর্তন করুন; } // সম্পূর্ণ পাসওয়ার্ডটি এখন মেমরিতে রয়েছে, তাই // এটি একটি স্ট্রিং হিসাবে প্রিন্ট করুন এবং পুরো বাফারটি দেখান... printf("সম্পূর্ণ স্ট্রিং ছিল: %sn", buff); হেক্সডাম্প(বাফ,1); // এখনই প্রসেস RAM ডাম্প করতে বিরতি দিন (ট্রাই করুন: 'procdump -ma') রাখে("বাফার মুক্ত করতে [ENTER] এর জন্য অপেক্ষা করছে..."); getchar(); // আনুষ্ঠানিকভাবে মুক্ত() মেমরি এবং বাফার দেখান // আবার দেখুন কিছু পিছনে পড়ে আছে কিনা... ভার্চুয়ালফ্রি(বাফ,128,মেম_রিলেজ); printf("মুক্তির পরে বাফার ডাম্পিং()n"); হেক্সডাম্প(বাফ,0); // পার্থক্য পুট পরিদর্শন করতে আবার RAM ডাম্প করতে বিরাম দিন("প্রধান()..." থেকে প্রস্থান করার জন্য [ENTER] এর জন্য অপেক্ষা করা হচ্ছে); getchar(); রিটার্ন 128; }
নিবন্ধ থেকে কোড: S1.LUA
-- কিছু স্থির, অনুসন্ধানযোগ্য পাঠ্য s = 'unlikelytext' দিয়ে শুরু করুন -- i = 16 do s = s .. string.char(1,16+math.random( 65)) শেষ মুদ্রণ ('সম্পূর্ণ স্ট্রিং হল:',s,'n') -- প্রক্রিয়া RAM প্রিন্ট ডাম্প করতে বিরতি ('স্ট্রিং মুক্ত করার আগে [ENTER] এর জন্য অপেক্ষা করা হচ্ছে...') io.read() - - স্ট্রিং মুছুন এবং অব্যবহৃত পরিবর্তনশীল চিহ্নিত করুন s = nil -- ডিফ প্রিন্ট খুঁজতে আবার RAM ডাম্প করুন ('প্রস্থান করার আগে [ENTER] এর জন্য অপেক্ষা করছে...') io.read()
নিবন্ধ থেকে কোড: FINDIT.LUA
-- ডাম্প ফাইলে পড়ুন স্থানীয় f = io.open(arg[1],'rb'):read('*a') -- মার্কার টেক্সট দেখুন একটির পরে -- বা একাধিক র্যান্ডম ASCII অক্ষর স্থানীয় b,e ,m = 0,0,nil while true do -- পরের ম্যাচের জন্য দেখুন এবং মনে রাখবেন অফসেট b,e,m = f:find('(unlikelytext[AZ]+)',e+1) -- আর না থাকলে প্রস্থান করুন মেলে যদি b না হয় তাহলে ব্রেক এন্ড -- রিপোর্ট পজিশন এবং স্ট্রিং ফাউন্ড প্রিন্ট(string.format('%08X: %s',b,m)) শেষ
নিবন্ধ থেকে কোড: SEARCHKNOWN.LUA
io.write('ডাম্প ফাইলে পড়া...') local f = io.open(arg[1],'rb'):read('*a') io.write('DONE.n') io. লিখুন ('8-বিট ASCII হিসাবে SIXTEENPASSCHARS অনুসন্ধান করা হচ্ছে...') স্থানীয় p08 = f:find('SIXTEENPASSCHARS') io.write(p08 এবং 'FOUND' বা 'found not','.n') io.write ('UTF-16 হিসাবে SIXTEENPASSCHARS এর জন্য অনুসন্ধান করা হচ্ছে...') স্থানীয় p16 = f:find('Sx00Ix00Xx00Tx00Ex00Ex00Nx00Px00'.. 'Ax00Sx00Sx00Cx00Hx00Ax00Sx00Cx00Hx16AxXNUMXRi' and'XNUMXpXNUMXRxio) 'বা 'পাওয়া যায়নি','.n')
নিবন্ধ থেকে কোড: FINDBLOBS.LUA
-- কমান্ড লাইনে নির্দিষ্ট করা ডাম্প ফাইলে পড়ুন local f = io.open(arg[1],'rb'):read('*a') -- এক বা একাধিক পাসওয়ার্ড ব্লব দেখুন, তার পরে যেকোন নন-ব্লব -- মনে রাখবেন যে ব্লব অক্ষরগুলি (●) উইন্ডোজ ওয়াইডচারগুলিতে এনকোড করে -- লিট-এন্ডিয়ান UTF-16 কোড হিসাবে, হেক্সে CF 25 হিসাবে বেরিয়ে আসছে। স্থানীয় b,e,m = 0,0,nil while true do -- আমরা এক বা একাধিক ব্লব চাই, যে কোনো নন-ব্লব অনুসরণ করে। -- আমরা একটি স্পষ্ট CF25 খোঁজার মাধ্যমে কোডটিকে সরলীকরণ করি -- এর পরে যে কোনো স্ট্রিং যার মধ্যে শুধুমাত্র CF বা 25 আছে, -- তাই আমরা CF25CFCF বা CF2525CF পাশাপাশি CF25CF25 খুঁজে পাব। -- আমরা পরে "মিথ্যা ইতিবাচক" ফিল্টার করব যদি কোন থাকে। -- আমাদের x25 এর পরিবর্তে '%%' লিখতে হবে কারণ x25 -- অক্ষর (শতাংশ চিহ্ন) লুয়াতে একটি বিশেষ অনুসন্ধান অক্ষর! b,e,m = f:find('(xCF%%[xCF%%]*)',e+1) -- প্রস্থান করুন যখন আর মিল না থাকলে b না হলে বিরতি শেষ -- CMD.EXE মুদ্রণ করতে পারে না blobs, তাই আমরা তাদের তারা রূপান্তর. print(string.format('%08X: %s',b,m:gsub('xCF%%','*'))) শেষ
নিবন্ধ থেকে কোড: SEARCHKP.LUA
-- কমান্ড লাইনে নির্দিষ্ট করা ডাম্প ফাইলে পড়ুন স্থানীয় f = io.open(arg[1],'rb'): read('*a') স্থানীয় b,e,m,p = 0,0,nil,nil যদিও সত্য হয় -- এখন, আমরা কোড অনুসরণ করে এক বা একাধিক ব্লব (CF25) চাই -- A..Z এর জন্য একটি 0 বাইট অনুসরণ করে ACSCII কে UTF-16 b,e,m = f:find('তে রূপান্তর করতে) (xCF%%[xCF%%]*[AZ])x00',e+1) -- প্রস্থান করুন যখন আর কোন মিল না থাকলে b না হলে ব্রেক এন্ড -- CMD.EXE ব্লব প্রিন্ট করতে পারে না, তাই আমরা সেগুলিকে রূপান্তর করি তারা -- স্থান বাঁচাতে আমরা ধারাবাহিক মিলগুলিকে দমন করি যদি m ~= p তারপর প্রিন্ট(string.format('%08X: %s',b,m:gsub('xCF%%','*'))) p = m শেষ শেষ
- এসইও চালিত বিষয়বস্তু এবং পিআর বিতরণ। আজই পরিবর্ধিত পান।
- প্লেটোএআইস্ট্রিম। Web3 ডেটা ইন্টেলিজেন্স। জ্ঞান প্রসারিত. এখানে প্রবেশ করুন.
- অ্যাড্রিয়েন অ্যাশলির সাথে ভবিষ্যত মিন্টিং। এখানে প্রবেশ করুন.
- PREIPO® এর সাথে PRE-IPO কোম্পানিতে শেয়ার কিনুন এবং বিক্রি করুন। এখানে প্রবেশ করুন.
- উত্স: https://nakedsecurity.sophos.com/2023/05/31/serious-security-that-keepass-master-password-crack-and-what-we-can-learn-from-it/
- : আছে
- : হয়
- :না
- :কোথায়
- [পৃ
- $ ইউপি
- 1
- 10
- 12
- 15%
- 20
- 200
- 2023
- 24
- 250
- 27
- 31
- 3d
- 49
- 50
- 67
- 70
- 72
- 77
- 8
- 9
- a
- সক্ষম
- সম্পর্কে
- উপরে
- পরম
- AC
- প্রবেশ
- হিসাব
- অর্জন
- অর্জন
- সক্রিয়
- আসল
- প্রকৃতপক্ষে
- যোগ
- অতিরিক্ত
- ঠিকানা
- ঠিকানাগুলি
- যোগ করে
- পর
- পরে
- আবার
- সব
- বরাদ্দ
- বরাদ্দ
- বণ্টন
- বরাদ্দ
- অনুমতি
- একা
- বরাবর
- ইতিমধ্যে
- এছাড়াও
- রদবদল করা
- যদিও
- সর্বদা
- an
- এবং
- অ্যান্ড্রু
- উত্তর
- কোন
- কিছু
- সমালোচনামূলক কিছু
- প্রদর্শিত
- হাজির
- অভিগমন
- অনুমোদিত
- রয়েছি
- কাছাকাছি
- প্রবন্ধ
- প্রবন্ধ
- AS
- At
- লেখক
- গাড়ী
- স্বয়ংক্রিয়
- স্বয়ংক্রিয়ভাবে
- সহজলভ্য
- এড়াতে
- অপবারিত
- সচেতন
- দূরে
- পিছনে
- পটভূমি
- পটভূমি চিত্র
- BE
- কারণ
- হয়ে
- হয়েছে
- আগে
- শুরু
- পিছনে
- দৃশ্যের অন্তরালে
- নিচে
- উত্তম
- বিট
- বাধা
- ব্লক
- সীমান্ত
- উভয়
- পাদ
- তরবার
- ব্র্যান্ড নিউ
- বিরতি
- সংক্ষেপে
- আনা
- বাফার
- বাফার ওভারফ্লো
- নম
- বাগ
- নির্মাণ করা
- কিন্তু
- by
- সি ++
- কল
- কলিং
- CAN
- পেতে পারি
- যত্ন
- কেস
- ধরা
- CD
- কেন্দ্র
- অবশ্যই
- চেইন
- সুযোগ
- পরিবর্তিত
- চরিত্র
- অক্ষর
- পরীক্ষণ
- চেক
- চীনা
- বেছে নিন
- পরিষ্কার
- পরিষ্কারভাবে
- ঘনিষ্ঠ
- কোড
- রঙ
- এর COM
- আসে
- আসছে
- মন্তব্য
- মন্তব্য
- সাধারণ
- সম্পূর্ণ
- জটিল
- কম্পিউটার
- বিবেচনা
- গণ্যমান্য
- বিবেচিত
- গঠিত
- নির্মাতা
- বিষয়বস্তু
- সুখী
- অবিরাম
- চলতে
- নিয়ন্ত্রণ
- রূপান্তর
- কপিরাইট
- অনুরূপ
- পারা
- আবরণ
- ফাটল
- সৃষ্টি
- নির্মিত
- স্রষ্টা
- সংকটপূর্ণ
- সাইবার নিরাপত্তা
- বিপদ
- বিপজ্জনক
- উপাত্ত
- তথ্য ফাঁস
- দিন
- লেনদেন
- সিদ্ধান্ত নিয়েছে
- নিবেদিত
- বর্ণিত
- DID
- পার্থক্য
- বিভিন্ন
- অসুবিধা
- খনন করা
- ডিজিটাল
- সরাসরি
- সরাসরি অ্যাক্সেস
- সরাসরি
- প্রদর্শন
- প্রদর্শক
- মীমাংসা করা
- do
- কাগজপত্র
- না
- না
- করছেন
- সম্পন্ন
- Dont
- নিচে
- ড্রাইভ
- কারণে
- মনমরা ভাব
- সময়
- e
- প্রতি
- পূর্বে
- সহজে
- বাস্তু
- পারেন
- আর
- ইমেল
- সক্রিয়
- উদ্দীপক
- এনক্রিপশন
- শেষ
- প্রান্ত
- যথেষ্ট
- নিশ্চিত করা
- নিশ্চিত
- প্রবেশ করান
- প্রবেশন
- সমগ্র
- প্রবেশ
- পরিবেশ
- সমতুল্য
- ভুল
- মূলত
- আনুমানিক
- ইত্যাদি
- থার (eth)
- এমন কি
- অবশেষে
- ক্রমবর্ধমান
- প্রতি
- সব
- ঠিক
- উদাহরণ
- ছাড়া
- হুজুগ
- ফাঁসি
- থাকা
- বিদ্যমান
- প্রস্থান
- প্রস্থান করা হচ্ছে
- আশা করা
- ব্যাখ্যা করা
- কাজে লাগান
- উদ্ভাসিত
- প্রসারিত করা
- অতিরিক্ত
- নির্যাস
- সত্য
- মিথ্যা
- চটুল
- বৈশিষ্ট্য
- প্রতিক্রিয়া
- কম
- যুদ্ধ
- ফাইল
- নথি পত্র
- ছাঁকনি
- চূড়ান্ত
- পরিশেষে
- আবিষ্কার
- আবিষ্কার
- খুঁজে বের করে
- জরিমানা
- প্রথম
- স্থায়ী
- কেন্দ্রবিন্দু
- অনুসৃত
- অনুসরণ
- জন্য
- ফর্ম
- আনুষ্ঠানিকভাবে
- বিন্যাস
- আসন্ন
- পাওয়া
- চার
- বিনামূল্যে
- থেকে
- সম্পূর্ণ
- সম্পূর্ণরূপে
- ক্রিয়া
- ক্রিয়াকলাপ
- অধিকতর
- ভবিষ্যৎ
- উত্পন্ন
- প্রজন্ম
- পাওয়া
- পেয়ে
- GitHub
- দাও
- প্রদত্ত
- দেয়
- দান
- Go
- Goes
- চালু
- ভাল
- সরকার
- দখল
- মহান
- জামিন
- ছিল
- হ্যান্ডলগুলি
- ঘটেছিলো
- ঘটনা
- এরকম
- কঠিন
- আছে
- জমিদারি
- মাথাব্যাথা
- ভারী
- উচ্চতা
- এখানে
- HEX
- উচ্চস্তর
- ঊর্ধ্বতন
- হিট
- রাখা
- গর্ত
- আশা
- ঘন্টার
- বাতাসে ভাসিতে থাকা
- কিভাবে
- কিভাবে
- HTTPS দ্বারা
- খোজা
- i
- আইডেন্টিফায়ার
- if
- অবিলম্বে
- গুরুত্বপূর্ণ
- in
- অন্তর্ভুক্ত
- সুদ্ধ
- তথ্য
- অবগত
- পরিবর্তে
- আগ্রহী
- অন্তর্বর্তী
- Internet
- মধ্যে
- সমস্যা
- IT
- এর
- নিজেই
- অপভাষা
- জুন
- মাত্র
- শুধু একটি
- রাখা
- চাবি
- জানা
- পরিচিত
- কোরিয়ান
- ভাষা
- ভাষাসমূহ
- ল্যাপটপ
- গত
- পরে
- নেতৃত্ব
- বিশালাকার
- ফুটো
- লিকস
- শিখতে
- শিক্ষা
- অন্তত
- ছোড়
- বাম
- লম্বা
- চিঠি
- লাইব্রেরি
- জীবন
- মত
- সম্ভবত
- সীমিত
- লাইন
- লাইন
- তালিকা
- তালিকাভুক্ত
- ll
- বোঝা
- স্থানীয়
- অবস্থান
- লগিং
- দীর্ঘ
- দীর্ঘ মেয়াদী
- আর
- দেখুন
- মত চেহারা
- তাকিয়ে
- খুঁজছি
- সৌন্দর্য
- অনেক
- ভাগ্য
- রক্ষণাবেক্ষণ
- করা
- ম্যালওয়্যার
- পরিচালনা করা
- পরিচালিত
- ব্যবস্থাপনা
- পরিচালক
- পরিচালনা করে
- দক্ষতা সহকারে হস্তচালন
- অনেক
- মার্জিন
- ছাপ
- মার্কার
- মালিক
- ম্যাচ
- ম্যাচিং
- সর্বোচ্চ প্রস্থ
- মে..
- মানে
- স্মৃতি
- উল্লিখিত
- মাইক্রোসফট
- হতে পারে
- মিনিট
- বিনয়ী
- পরিবর্তিত
- পরিবর্তন
- মুহূর্ত
- পর্যবেক্ষণ
- অধিক
- সেতু
- অনেক
- বহু
- ঝরঝরে
- প্রয়োজন
- প্রয়োজন
- নেট
- না
- তবু
- নতুন
- সংবাদ
- পরবর্তী
- সুন্দর
- না।
- সাধারণ
- কিছু না
- লক্ষ্য করুন..
- এখন
- সংখ্যা
- সংখ্যার
- লক্ষ্য
- সুস্পষ্ট
- of
- বন্ধ
- কর্মকর্তা
- সরকারী ভাবে
- অফসেট
- পুরাতন
- on
- একদা
- ONE
- কেবল
- ওপেন সোর্স
- অপারেটিং
- অপারেটিং সিস্টেম
- অপারেটিং সিস্টেম
- অপারেটর
- পছন্দ
- or
- ক্রম
- মূল
- অন্যান্য
- অন্যরা
- অন্যভাবে
- আমাদের
- নিজেদেরকে
- বাইরে
- আউটপুট
- শেষ
- সামগ্রিক
- নিজের
- পৃষ্ঠা
- আতঙ্ক
- অংশ
- পাসওয়ার্ড
- পাসওয়ার্ড ম্যানেজার
- পাসওয়ার্ড
- পথ
- প্যাটার্ন
- পল
- বিরতি
- বেতন
- শতাংশ
- সম্ভবত
- কাল
- স্থায়িভাবে
- ব্যক্তিগত
- ব্যক্তিগত তথ্য
- শারীরিক
- ছবি
- টুকরা
- জায়গা
- স্থানধারক
- প্লেগ
- Plato
- প্লেটো ডেটা ইন্টেলিজেন্স
- প্লেটোডাটা
- প্রচুর
- বিন্দু
- পয়েন্ট
- জনপ্রিয়
- অবস্থান
- সম্ভব
- পোস্ট
- সম্ভাব্য
- অবিকল
- বর্তমান
- চমত্কার
- প্রতিরোধ
- আগে
- মূল্য
- প্রিন্ট
- কপি করে প্রিন্ট
- সম্ভবত
- সমস্যা
- প্রক্রিয়া
- কার্যক্রম
- প্রোগ্রামার
- প্রোগ্রামাররা
- প্রোগ্রামিং
- প্রোগ্রাম
- উচ্চারিত
- করা
- পাইথন
- প্রশ্ন ও উত্তর
- প্রশ্ন
- উত্থাপন
- র্যাম
- এলোমেলো
- পরিসর
- বরং
- কাঁচা
- মূল তথ্য
- RE
- পৌঁছেছে
- পড়া
- পড়া
- প্রস্তুত
- বাস্তব
- বাস্তব জীবন
- প্রকৃত সময়
- সত্যিই
- চিনতে
- উদ্ধার করুন
- পুনরুদ্ধার
- সংশ্লিষ্ট
- অবশিষ্ট
- মনে রাখা
- দূরবর্তী
- অপসারণ
- পুনরাবৃত্তি
- পুনরাবৃত্ত
- পুনঃপুনঃ
- রিপোর্ট
- প্রতিনিধিত্ব
- সম্মান
- যথাক্রমে
- বিশ্রাম
- ফলাফল
- প্রত্যাবর্তন
- ফিরতি
- প্রকাশ করা
- পরিত্রাণ
- অধিকার
- ঝুঁকি
- ঝুঁকি
- কক্ষ
- চালান
- দৌড়
- রানটাইম পর্যবেক্ষণ
- s
- নিরাপদ
- নিরাপদ
- একই
- সন্তুষ্ট
- সংরক্ষণ করুন
- উক্তি
- স্ক্যান
- বিক্ষিপ্ত
- লোকচক্ষুর
- সার্চ
- অনুসন্ধানের
- দ্বিতীয়
- সেকেন্ড
- গোপন
- অধ্যায়
- নিরাপদ
- নিরাপত্তা
- দেখ
- বীজ
- এইজন্য
- মনে
- দেখা
- দেখেন
- ক্রম
- গম্ভীর
- সেট
- বিন্যাস
- সংক্ষিপ্ত
- শীঘ্র
- উচিত
- প্রদর্শনী
- প্রদর্শিত
- চিহ্ন
- স্বাক্ষর
- অনুরূপ
- একভাবে
- সহজ
- সরলীকৃত
- সহজতর করা
- কেবল
- একক
- আয়তন
- ঘুম
- ছোট
- গোপন
- snooping
- So
- সফটওয়্যার
- কঠিন
- কিছু
- কিছু
- শীঘ্রই
- উৎস
- সোর্স কোড
- স্থান
- প্রশিক্ষণ
- বিশেষত
- নিদিষ্ট
- স্পীড
- তারার
- শুরু
- শুরু
- শুরু হচ্ছে
- শুরু
- প্রারম্ভকালে
- এখনো
- উত্তরী
- থামুন
- বন্ধ
- দোকান
- সঞ্চিত
- গল্প
- স্ট্রিং
- শক্তিশালী
- অধ্যয়ন
- সফলভাবে
- এমন
- যথেষ্ট
- অনুমিত
- আশ্চর্য
- বিস্মিত
- বিস্ময়কর
- টেকা
- করা SVG
- বিনিময়
- পদ্ধতি
- সিস্টেম
- গ্রহণ করা
- ধরা
- লাগে
- গ্রহণ
- কথা বলা
- টেকনিক্যালি
- প্রযুক্তি
- অস্থায়ী
- পরীক্ষা
- পরীক্ষা
- চেয়ে
- যে
- সার্জারির
- উৎস
- তাদের
- তাহাদিগকে
- নিজেদের
- তারপর
- তত্ত্ব
- সেখানে।
- অতএব
- তারা
- জিনিস
- মনে
- এই
- সেগুলো
- যদিও?
- চিন্তা
- সময়
- শিরনাম
- থেকে
- একসঙ্গে
- গ্রহণ
- টুল
- শীর্ষ
- পথ
- অনুসরণকরণ
- রূপান্তর
- স্বচ্ছ
- সত্য
- চেষ্টা
- পরিণত
- দুই
- আদর্শ
- সাধারণত
- বোঝা
- ইউনিকোড
- পর্যন্ত
- অব্যবহৃত
- অনাবশ্যক
- আপডেট
- আপডেট
- URL টি
- us
- মার্কিন সরকার
- ব্যবহার
- ইউএসবি
- ব্যবহার
- ব্যবহার-পর-মুক্ত
- ব্যবহৃত
- ব্যবহারকারী
- ব্যবহারসমূহ
- ব্যবহার
- উপযোগ
- মূল্য
- মানগুলি
- বৈচিত্র্য
- যাচাই
- সংস্করণ
- খুব
- মাধ্যমে
- দুর্বলতা
- W
- অপেক্ষা করুন
- প্রতীক্ষা
- প্রয়োজন
- চেয়েছিলেন
- ছিল
- ওয়াচ
- উপায়..
- উপায়
- we
- সপ্তাহ
- আমরা একটি
- ছিল
- কি
- কখন
- কিনা
- যে
- যখন
- হু
- যে কেউ
- সমগ্র
- কেন
- ইচ্ছা
- জয়
- জানালা
- মুছা
- সঙ্গে
- ছাড়া
- ভাবছি
- শব্দ
- হয়া যাই ?
- কাজ করছে
- কাজ
- কাজ
- চিন্তা
- would
- দিতে হবে
- লেখা
- লেখা
- লিখিত
- এখনো
- আপনি
- আপনার
- নিজেকে
- zephyrnet
- শূন্য