𝗦𝘁𝗼𝗽 𝗧𝗿𝘂𝘀𝘁𝗶𝗻𝗴 𝗧𝗵𝗲 𝗔𝗴𝗲𝗻𝘁: 𝗕𝗶𝗻𝗱 𝗔𝗽𝗽𝗿𝗼𝘃𝗮𝗹𝘀 𝘁𝗼 𝗘𝘅𝗮𝗰𝘁 𝗧𝗼𝗼𝗹 𝗖𝗮𝗹𝗹𝘀
చాలా ఏజెంటిక్ సిస్టమ్స్ ఫైల్ రైట్స్ లేదా మనీ ట్రాన్స్ఫర్స్ వంటి ప్రమాదకరమైన చర్యలను కేవలం ఒక సాధారణ అప్రూవల్తో మాత్రమే రక్షిస్తాయి.
సాధారణంగా, ఈ అప్రూవల్ సిస్టమ్ స్టేట్లో ఒక బూలియన్ ఫ్లాగ్ (boolean flag) రూపంలో ఉంటుంది.
ఉదాహరణకు: approved: true.
ఇది ఒక పొరపాటు. బూలియన్ అనేది అటాకర్లు దుర్వినియోగం చేసే మూడు విధాలుగా విఫలమవుతుంది:
- ఫ్లిప్ (Flip): ప్రాంప్ట్ ఇంజెక్షన్ లేదా కోడ్ లోపాల ద్వారా అటాకర్ స్టేట్ను false నుండి true కి మారుస్తారు.
- రీప్లే (Replay): మీరు "read file" వంటి సురక్షితమైన కమాండ్ను అప్రూవ్ చేస్తారు. సిస్టమ్ "true" అని చూసి, "delete database" వంటి రెండవ ప్రమాదకరమైన కమాండ్ను అనుమతిస్తుంది.
- ఆర్గుమెంట్ డ్రిఫ్ట్ (Argument Drift): మీరు "send $10" అని అప్రూవ్ చేస్తారు. ఎగ్జిక్యూషన్ కంటే ముందు అటాకర్ ఆ మొత్తాన్ని $10,000 కి మారుస్తారు. ఫ్లాగ్ మాత్రం ఇంకా "true" అనే ఉంటుంది.
సమస్య ఏమిటంటే, మీరు అప్రూవల్ను మొత్తం సెషన్ యొక్క లక్షణంగా (property) పరిగణిస్తున్నారు. అది ఒక నిర్దిష్ట కాల్కు సంబంధించిన సాక్ష్యంగా ఉండాలి.
దీన్ని ఎలా సరిదిద్దాలి:
ఒక మనిషి కాల్ను అప్రూవ్ చేసినప్పుడు, ఒక సురక్షితమైన ట్యాగ్ను (secure tag) సృష్టించండి. ఈ ట్యాగ్ ఈ నాలుగు అంశాలను లాక్ చేయాలి:
- యూనిక్ టూల్ కాల్ ID.
- ఖచ్చితమైన ఆర్గుమెంట్స్ యొక్క హాష్ (hash).
- యూజర్ ఐడెంటిటీ (user identity).
- ఎక్స్పైరీ టైమ్ (expiration time).
ఎగ్జిక్యూషన్ జరిగే ఖచ్చితమైన సమయంలో ఈ ట్యాగ్ను వెరిఫై చేయండి. సిస్టమ్కు మాత్రమే తెలిసిన సీక్రెట్ కీని (secret key) ఉపయోగించండి.
ఇంప్లిమెంటేషన్ కోసం ఈ నియమాలను పాటించండి:
- కానానికలైజేషన్ (Canonicalization) ఉపయోగించండి: అప్రూవర్ మరియు ఎగ్జిక్యూటర్ ఇద్దరూ ఖచ్చితంగా ఒకే బైట్స్ను హాష్ చేయాలి. నంబర్లు మరియు కీలు సరిపోలేలా చూడటానికి RFC 8785ని ఉపయోగించండి.
- ఫెయిల్ క్లోజ్డ్ (Fail Closed): ట్యాగ్ లేకపోయినా, ఎక్స్పైరీ అయిపోయినా లేదా తప్పుగా ఉన్నా, ఒక నిర్దిష్టమైన "not approved" ఎర్రర్ను రిటర్న్ చేయండి. దానిని సాధారణ టూల్ రిజల్ట్గా పరిగణించవద్దు.
- డినై బై డిఫాల్ట్ (Deny by Default): స్పష్టమైన అప్రూవల్ అవసరమయ్యే టూల్స్ను మాత్రమే అనుమతించండి. మిగిలినవన్నీ నిరాకరించండి.
- రీప్లేస్ను హ్యాండిల్ చేయండి (Handle Replays): మీరు Temporal వంటి ఇంజిన్లను ఉపయోగిస్తుంటే, మీ సీక్రెట్ కీ డిటర్మినిస్టిక్ (deterministic) అని నిర్ధారించుకోండి. సిస్టమ్ రీస్టార్ట్ అయిన తర్వాత కీ మారితే, ఇప్పటికే ఉన్న అప్రూవల్స్ అన్నీ విఫలమవుతాయి.
అథరైజేషన్ (Authorization) అనేది ఒక ఫ్లోటింగ్ స్టేట్గా ఉండకూడదు. అది ఇలా నిరూపించే ఒక బౌండ్ ఎన్వలప్గా ఉండాలి: "ఈ నిర్దిష్ట వ్యక్తి, ఈ నిర్దిష్ట సమయం వరకు, ఈ నిర్దిష్ట టూల్ కోసం ఈ నిర్దిష్ట ఆర్గుమెంట్స్ను అప్రూవ్ చేశారు."
బూలియన్లను ఉపయోగించడం ఆపండి. అవి సరళీకరణ కాదు. అవి ఒక బగ్ (bug).
ఐచ్ఛిక అభ్యాస సమూహం: https://t.me/GyaanSetuAi