Safari MCP-ஐ அடிப்படையாகக் கொண்டு உருவாக்கப்பட்ட ஒரு ஆட்டோமேஷன் கருவி, ஒரு டெவலப்பரின் டேஷ்போர்டு டேப் (dashboard tab) வாசிக்கப்பட்டுக்கொண்டிருந்தபோது அதை மூடிவிட்டது. AI-ஆல் இயக்கப்படும் ஏஜெண்டுகள் (agents) தங்களுக்குச் சொந்தமில்லாத எந்தத் டேப்பிலும் தலையிடாமல் தடுப்பதற்காக உருவாக்கப்பட்ட 'கார்டு' (guard)-இல் இருந்த ஒரு மறைமுகக் குறைபாட்டை இந்தச் சம்பவம் வெளிப்படுத்தியது. மேலும், "safe-by-default" (இயல்பாகவே பாதுகாப்பானது) என்ற வகைப்பாடுகள் ஏன் ஒரு சுமையாக மாறக்கூடும் என்பதையும் இது காட்டுகிறது.

வேலை செய்த கார்டு—அது வேலை செய்யாத வரை

இந்தக் கருவி தான் உருவாக்கும் ஒவ்வொரு டேப்பிற்கும் ஒரு உள் அடையாளத்தை (internal identifier) குறியீடாக இடுகிறது. ஏஜெண்ட் ஏதேனும் கட்டளையை வழங்குவதற்கு முன், கார்டு அந்த அடையாளத்தைச் சரிபார்க்கிறது; அந்த அடையாளம் இல்லையென்றால், கார்டு செயல்பட மறுக்கிறது. நடைமுறையில், ஏஜெண்ட் தான் திறக்காத ஒரு பக்கத்தைப் படிப்பதிலிருந்து கார்டு தடுத்தது—அது எதற்காக வடிவமைக்கப்பட்டதோ அதையே செய்தது.

ஒரு படிவத்தைப் (form) பூர்த்தி செய்து கொண்டிருந்தபோது, அந்தப் பக்கம் வேறொரு டொமைனுக்குத் திசைதிருப்பப்பட்டது (redirect). அந்தத் திசைதிருப்பல் அடையாளத்தை நீக்கிவிட்டதால், டேப் அடையாளம் தெரியாத நிலையில் இருந்தது. அடையாளக் குறியீடு இல்லாததைக் கண்ட கார்டு, “என்னால் உரிமையைச் சரிபார்க்க முடியாது, எனவே நான் இந்த டேப்பைப் படிக்க மாட்டேன்” என்று தெரிவித்தது. அந்தத் தருணத்தில், பாதுகாப்புச் சரிபார்ப்பு எதிர்பார்த்தபடியே செயல்பட்டது.

எல்லையைத் தாண்டிய கிளீனப் கோட் (cleanup code)

அடுத்து, அடையாளக் குறியீடு இல்லாத 'அனாதை' (orphaned) டேப்களை மூடுவதற்காக ஒரு மேனுவல் கிளீனப் ரூட்டின் (manual cleanup routine) பயன்படுத்தப்பட்டது. அந்த ரூட்டின், உரிமையை முதலில் உறுதிப்படுத்தாமல் கருவியிடம் “ஒரு டேப்பை மூடு” (close a tab) என்று கேட்டது. அந்தத் டேப் தனக்குச் சொந்தமானது என்று கார்டால் நிரூபிக்க முடியாததால், கருவி அதன் இயல்பான செயலைச் செய்தது: “தற்போதைய டேப்பை மூடு” (close the current tab). ஆனால் அந்தத் தற்போதைய டேப் டெவலப்பர் வாசித்துக் கொண்டிருந்த டேஷ்போர்டு de, அனாதை டேப் அல்ல.

இதன் விளைவாக, ஒரு முட்டுச்சந்தையாக (dead end) இருக்க வேண்டிய பாதுகாப்புப் பாதையினால் ஒரு அழிவுச் செயல்பாடு (destructive operation) தூண்டப்பட்டது.

"உரிமை இல்லை" என்பதை அனுமதியாகக் கருதிய மூன்று அடுக்குகள்

  1. கட்டளை வகைப்பாடு (Command categorisation) – கட்டளைகளைத் தொகுத்த பட்டியல், close_tab என்பதை "tab management" என்ற பரந்த பிரிவின் கீழ் வைத்திருந்தது. "list tabs" போன்ற பிற கட்டளைகள் தகவல்களைப் படிக்கும் மட்டுமே என்பதால், அந்தப் பிரிவில் உள்ள அனைத்தும் பாதுகாப்பானவை என்று டெவலப்பர் கருதினார். close_tab என்பது அழிவுத்தன்மை கொண்டது என்று எந்தத் தெளிவான குறிப்பும் இல்லை, எனவே அது அதன் அருகிலுள்ள கட்டளைகளின் பாதுகாப்பையே பெற்றது.
  2. எக்ஸ்டென்ஷன்-நிலை கொள்கை (Extension-level policy) – அனைத்து பிரவுசர் செயல்பாடுகளையும் நிர்வகிக்கும் Safari எக்ஸ்டென்ஷன், ஒரு செஷனுக்கு (session) எந்த உரிமையும் இல்லாதபோது எந்தச் செயல்பாட்டையும் அனுமதித்தது. அந்த விதி 'read-only' செயல்பாடுகளுக்குச் சரியாக இருந்தாலும், அது close_tab கட்டளையை எந்தத் தடயவியல் சரிபார்ப்பும் (provenance check) இன்றிச் செயல்படுத்த வழிவகுத்தது.
  3. தர்க்கப் பிழை (Logic mismatch) – கிளீனப் ரூட்டின் ஒரு டேப்பில் உள்ள உரிமையைக் சரிபார்த்தது, ஆனால் பிரவுசர் “current” என்று குறிப்பிட்ட டேப்பில் மூடும் செயல்பாட்டை (close function) அழைத்தது. இந்த முரண்பாடு, அடையாளக் குறியீட்டைக் கண்டறியத் தவறிய கார்டின் தோல்வியைப் பயன்படுத்தி, மூடும் கட்டளையைத் தவறான இலக்கிற்குத் திசைதிருப்ப அனுமதித்தது.

ஒவ்வொரு அடுக்கும் “உரிமை பதிவு செய்யப்படவில்லை” என்பதை “செயல்படப் பாதுகாப்பானது” என்று கருதியது, மேலும் இவை அனைத்தும் இணைந்து எந்தவிதமான சட்டபூர்வமான ஆதாரமும் இன்றி ஒரு டேப்பை மூடும் கட்டளையைச் செயல்படுத்தின.

தீர்வு: அழிவுத்தன்மை கொண்ட செயல்களுக்கு உரிமையின் ஆதாரம் கட்டாயம்

திருத்தப்பட்ட தர்க்கம், 'read-only' பாதைகளை அழிவுத்தன்மை கொண்ட பாதைகளிலிருந்து பிரிக்கிறது. இப்போது, ஒரு close_tab கட்டளைச் செயல்படுத்தப்படுவதற்கு முன், கருவி இலக்கு டேப்பிற்கான சரியான அடையாளத்தைக் காட்ட வேண்டும். அடையாளம் இல்லையென்றால், தற்போதைய டேப்பை மூடுவதற்குப் பதிலாக, அந்த கட்டளை ஒரு பிழையை (error) ஏற்படுத்தும். கார்டு இனி பொதுவான “ஏதாவது ஒன்றைச் செய்” (do something) என்ற பிரிவிற்குச் செல்லாது.

அடையாளக் குறியீடு இல்லாதது “செய்ய வேண்டியது ஏதுமில்லை” அல்லது “தொடரலாம்” எனத் தவறாகப் புரிந்துகொள்ளப்படும் தெளிவற்ற நிலையை இந்த மாற்றம் நீக்குகிறது. ஒரு தெளிவான தோல்வியைத் (explicit failure) திணிப்பதன் மூலம், கருவி பயனரின் வேலையைத் தற்செயலான இழப்பிலிருந்து பாதுகாக்கிறது.

டெவலப்பர்கள் கவனிக்க வேண்டியவை

  • வகைப்படையின் பெயர் பாதுகாப்பைக் தீர்மானிக்க அனுமதிக்காதீர்கள் – “tab management” போன்ற ஒரு லேபிள் அதனுள் இருக்கும் ஒவ்வொரு கட்டளையின் தாக்கத்தைப் பற்றியும் எதுவும் சொல்லாது. ஒவ்வொரு செயல்பாட்டின் பாதிப்பையும் (read vs. destroy) கட்டளைக்கு அருகிலேயே பதிவு செய்யுங்கள்.
  • கார்டு நிபந்தனைகள் செயலின் தீவிரத்திற்கு இணையாக இருக்க வேண்டும் – ஒரு தகவலைப் படிப்பதற்கான சரிபார்ப்பு, தரவை அழிக்கும் கட்டளைக்கு போதுமானதாக இருக்காது. ஒவ்வொரு வகை தாக்கத்திற்கும் தனித்தனி சரிபார்ப்பு வழிமுறைகளை (validation pipelines) உருவாக்குங்கள்.
  • மறைமுகத் தீர்வுகளைத் (implicit fallbacks) தவிர்க்கவும் – ஒரு கார்டால் உரிமையைச் சரிபார்க்க முடியாதபோது, பாதுகாப்பான பதில் அந்தச் செயலை ரத்து செய்வதே தவிர, ஒரு இயல்பான இலக்கைத் தேர்ந்தெடுப்பது அல்ல. இயல்பான செயல்பாடுகள் (default actions) பெரும்பாலும் 'privilege-escalation' பிழைகளுக்குக் காரணமாகின்றன.
  • அருகாமையில் உள்ளவற்றின் மீதான அனுமானங்களைச் சரிபார்க்கவும் – கட்டளைகள் அருகருகே இருக்கும் எந்தப் பட்டியலையோ அல்லது மெனுவையோ ஆய்வு செய்யுங்கள். குறியீடு பாதுகாப்பைத் தெளிவாக மறுமதிப்பீடு செய்யவில்லை என்றால், ஒரு சாதாரணமான கட்டளை அதன் அருகிலுள்ள கட்டளைகளின் மீதான நம்பிக்கையைப் பெற்றுவிடக்கூடும்.

சுருக்கம்

உரிமையைக் காக்கும் கார்டு இல்லாமை என்பது ஒரு பிழை (bug) அல்ல; அது ஒரு வடிவமைப்பு இடைவெளி (design gap). ஒவ்வொரு அழிவுத்தன்மை கொண்ட கட்டளையையும் அதிகாரத்திற்கான தெளிவான ஆதாரத்தைக் கோரும் ஒரு தனிப் பாதுகாப்புத் துறையாகக் கருதுங்கள், மேலும் “அடையாளம் இல்லை” என்பதை “தொடரலாம்” என்று ஒருபோதும் புரிந்துகொள்ள அனுமதிக்காதீர்கள். அப்போதுதான் ஆட்டோமேஷன் கருவிகள் தாங்கள் நிர்வகிக்க வேண்டிய டேப்களைப் பாதுகாக்க முடியும்.