printf - Python օգտագործողի մուտքագրում - Java printf

printf(user_input)-ը դեռևս վտանգավոր է. Ինչպես ես կոտրեցի կառուցվածքը ֆորմատով

Ի՞նչ են ձևաչափման տողերի սխալները։

Ձևաչափման տողերի սխալներ են առաջանում, երբ Python-ի չհաստատված օգտատիրոջ մուտքագրումը փոխանցվում է ձևաչափման ֆունկցիաներին, ինչպիսիք են՝ printf, System.out.printfկամ Python-ի f-strings-ը և գրանցման մեթոդները։ Այս ֆունկցիաները մեկնաբանում են ձևաչափի սպեցիֆիկատորները (օրինակ՝ %s, %xև այլն) տողում։ Եթե տողը գտնվում է օգտատիրոջ վերահսկողության տակ, դա կարող է հանգեցնել խափանումների կամ անվտանգության խնդիրների։

Այսպիսով, երբ մենք ասում ենք printf(օգտատիրոջ_մուտք), մենք զգուշացնում ենք Python-ի անվստահելի օգտատիրոջ մուտքագրման վերահսկողություն չտալ հզոր ձևաչափիչների վրա։

Իրական աշխարհի կարգավորում. printf(user_input) Python հավելվածում

Մշակողը ավելացրել է թվացյալ անվնաս debug հրաման՝ օգտագործելով printf(օգտատիրոջ_մուտք) Python սկրիպտի ներսում։ Դա commit անցել է կոդի վերանայումը և ընտրվել է CI-ի կողմից pipelineԿատարման ընթացքում ձևաչափիչը հանդիպեց Python-ի օգտատիրոջ մուտքագրմանը անսպասելի տոկեններով, ինչը հանգեցրեց վնասված արդյունքի և կառուցման ձախողման։

CI գրանցամատյան (հատված):

TypeError: սպասվում էր ձևաչափ… ստացվեց… Չարամիտ մուտքագրում չկա, պարզապես սխալ ձևաչափման ենթադրություն է։ Քանի որ printf-ը մեկնաբանում է կառուցվածքը, pipeline փլուզվեց այն բանի վրա, ինչը թվում էր սովորական ներդրում։

Թակարդը ակնհայտ է. Ինչու է printf(user_input)-ը դեռևս տեղի ունենում 2025 թվականին

Չնայած C դարաշրջանից ի վեր գոյություն ունեցող ձևաչափի տողերի խոցելիությանը, դրանք այսօր էլ խնդիր են մնում։ Արագընթաց մշակումը հաճախ ներառում է հատվածներ Stack Overflow-ից կամ ներքին գործիքներից պատճենելը։ Տող, ինչպիսին է printf(օգտատիրոջ մուտքագրում) or տպել(f"{օգտատիրոջ_մուտք}") թվում է անվնաս, բայց այդպես չէ։

Նույնիսկ ժամանակակից CVE-ներ ցույց տվեք իրական աշխարհի հետևանքները։ Վերցրեք CVE-2023-21930- ը որպես օրինակ՝ լայնորեն օգտագործվող Java printf իրականացման ձևաչափի տողի խոցելիությունը թույլ էր տալիս հարձակվողներին առաջացնել ծրագրերի խափանումներ կամ կարդալ զգայուն հիշողությունը։ Կամ CVE-2023-36052- ը, որն ազդում էր գրանցման համակարգի վրա, որտեղ օգտատիրոջ կողմից կառավարվող ձևաչափի տողերը հանգեցնում էին գրանցման համակարգի վնասմանը։

Սրանք ծայրահեղ խնդիրներ չեն. դրանք ազդում են ժամանակակից, ակտիվորեն պահպանվող գրադարանների և համակարգերի վրա։ Ժամանակակից լեզվի այնպիսի առանձնահատկություններ, ինչպիսիք են f-strings-ը և template literal-ները, հեշտացնում են ձևաչափումը, բայց նաև թաքցնում են բարդությունը: Անզգույշ օգտագործման դեպքում դրանք կարող են խափանել ծառայությունները կամ բացահայտել տրամաբանությունը:

Այս սխալները գոյություն ունեն ոչ միայն հնացած հավելվածներում։ Մենք դրանք տեսել ենք բաց կոդով CI սկրիպտներում, init գրանցամատյաններում և նույնիսկ Python-ի, Java printf-ի և Node.js-ի նման ժամանակակից փաթեթներով կառուցված անվտանգության գործիքներում։

Ներքեւի գիծ: printf(օգտատիրոջ_մուտք) դա պարզապես վատ ոճ չէ, այլ իրական ռիսկ։

Խոցելիության անատոմիա. Ինչ է անում printf(user_input)-ը

Անվանական արժեքով, printf(օգտատիրոջ_մուտք) պարզապես տպում է տող։ Բայց ներսից այն մեկնաբանում է որպես հրահանգների շարք։

Python-ում, Java-ում և Node.js-ում օրինաչափությունը նույնն է. ձևաչափի ֆունկցիաները վերլուծում են մուտքային տվյալները տոկենների համար, ինչպիսիք են՝ %s, %xԿամ {}Եթե ​​մուտքային տողը գալիս է օգտատիրոջից և չի ստուգվել, այդ տոկենները գործում են որպես հրամաններ: Սա կարող է հանգեցնել խափանումների, վնասված գրանցամատյանների կամ անվտանգության խնդիրների:

Ավելի վատն այն է, որ շատ գրադարաններ և փաթեթավորողներ վերացարկում են ձևաչափման քայլը, ուստի խոցելիությունը կարող է թաքնված լինել օգտակար ֆունկցիաների կամ գրանցման գործիքների խորքում: Դուք կարող եք մտածել, որ պարզապես տեքստ եք գրանցում, բայց Python-ի օգտատիրոջ մուտքագրումից կամ Java printf-ից ստացված անվստահելի տոկենները կարող են աննկատելիորեն խափանել ձեր ծրագիրը:

Վերցնելու համար՝ Ձևաչափման ֆունկցիաները միայն արդյունքի մասին չեն. դրանք մեկնաբանում են կառուցվածքը: Եթե թույլ տաք, որ օգտագործողի մուտքային տվյալները սահմանեն այդ կառուցվածքը, ապա ռիսկի եք դիմում անկայունության և խաթարման:

Իրական ռիսկը PipelineԱնմեղից Commit կառուցել անջատում

Այն սկսվում է մի փոքրից commit: log հրաման, որն օգտագործում է printf(օգտատիրոջ_մուտք):

CI-ն ընդունում է փոփոխությունը, կատարում այն, և ահա, գրանցամատյանները վնասված են, արդյունքը սխալ է դասավորված, թեստերը անընթեռնելի են։ Միայն մեկ չհաստատված Python օգտատիրոջ մուտքագրումը ձևաչափման տոկեններով բավարար էր փակելու համար։ pipeline.

CI/CD Հոսք:

  1. Դեւ commits կոդը printf(օգտատիրոջ_մուտք)
  2. CI առաջադրանքների կատարում, օգտագործողի կողմից կառավարվող մուտքային տվյալների մշակում
  3. Ձևաչափիչը սխալ է մեկնաբանում տող → ձախողում կամ խափանված արդյունք
  4. Կառուցումը ձախողվում է, հետաձգում է տեղակայումը և ավելացնում է վրիպազերծման ժամանակը

Սա տեսություն չէ։ Մենք տեսել ենք, թե ինչպես է այն դրսևորվում ժամանակակից միջավայրերում։

Ոչ միայն ժառանգություն. Ինչու՞ ձևաչափի սխալները դեռևս կարևոր են այսօր

Ձևաչափի տողերի սխալները մնացորդներ չեն, դրանք զարգացել են։ Python-ը, Java-ն և Node.js-ը բոլորն էլ աջակցում են հարուստ ձևաչափման գործիքներ: Եվ ժամանակակից մշակման սովորույթները հաճախ նշանակում են, որ Python-ի օգտատիրոջ մուտքագրման հոսքերը այս գործիքներում չեն ստուգվում:

Ինչու է դա դեռ պատահում։ Արագություն։ Ինտուիցիա։ Կրտսեր մշակողը կարող է գրել։ տպել(f"{օգտատիրոջ_մուտք}") առանց մտածելու։ Նույնը վերաբերում է նաև System.out.printf(օգտատիրոջ մուտքագրում) Javaավայում:

CVE-ները շարունակում են հայտնվել։ Վերջին անվտանգության նախազգուշացումները ընդգծում են ժամանակակից էկոհամակարգերում ձևաչափի տողերի հետ կապված խնդիրները։ CVE-2023-21930 (Java printf) և CVE-2023-36052 (logging framework) նման խոցելիությունները ցույց են տալիս, թե ինչպես ժամանակակից միջավայրերում չհաստատված ձևաչափի տողերը կարող են հանգեցնել խափանումների կամ տվյալների արտահոսքի։

CI/CD Միայնակ բավարար չէ։ CI-ն հաճախ ստուգում է շարահյուսությունն ու lint կանոնները, բայց ոչ թե անապահով ձևաչափի տողերի օգտագործումը։ Սա թողնում է կարևոր բաց։

Ականների հայտնաբերում. Ձևաչափի տողերի խնդիրների ժամանակակից հայտնաբերում

Այս սխալները հեշտ է գրել և դժվար է հայտնաբերել։

Ձեր IDE-ն հավանաբար չի փրկի ձեզ։ VS Code-ը, PyCharm-ը, IntelliJ-ը, չնայած հիանալի են բազմաթիվ սխալների դեպքում, դրանք սովորաբար չեն հետևում տվյալների հոսքին մուտքային աղբյուրների և ձևաչափման ֆունկցիաների միջև։ printf(օգտատիրոջ_մուտք) կամ System.out.printf(օգտատիրոջ մուտքագրում) Ձեր կոդի մեջ մուտքագրվող տեղեկատվությունը չի ազդանշան տագնապի ազդանշանի, քանի որ IDE-ները ենթադրում են, որ դուք եք վերահսկում ձևաչափվող տողը։

Լինտերները նույնպես չեն բռնում այն։ Հայտնի լինտերները, ինչպիսիք են flake8-ը, pylint-ը կամ eslint-ը, կենտրոնանում են շարահյուսության, ոճավորման և ավանդական սխալների վրա։ Եթե հատուկ կարգավորված չեն, դրանք դա չեն հասկանա։ օգտատիրոջ_մուտքագրում կարող է գալ արտաքին կամ անվստահելի աղբյուրից։ Գործարկվող GitHub գործողություն standard lint կանոնները, հավանաբար, ձեզ կանաչ նշիչ կտան, նույնիսկ եթե դուք մուտքագրել եք վտանգավոր ձևաչափի տող։

Որտեղ SAST Մուտքը՝ Ստատիկ կիրառման անվտանգության թեստավորում (SAST) եզակիորեն հարմար է այս խնդրին, քանի որ այն հետևում է տվյալների հոսքին ձեր կոդային բազայի միջոցով: Լավ SAST գործիք կարող է `

  • Հետևեք տվյալներին անվստահելի աղբյուրներից (օրինակ՝ Python-ի օգտատիրոջ մուտքագրում, միջավայրի փոփոխականներ, CLI արգումենտներ)
  • Որոշեք, թե երբ են այդ տվյալները հոսում զգայուն ընդունիչներ, ինչպիսիք են ձևաչափման ֆունկցիաները (printf, System.out.printf, f-տողեր)
  • Նշեք վտանգավոր ուղիները և ստեղծեք գործողության ենթակա ահազանգեր, նույնիսկ եթե ռիսկային գիծը թաքնված է օգնական մեթոդի կամ փաթաթան դասի ներսում։
  • Աջակցեք արգելափակման համար նախատեսված հատուկ կանոններին կամ քաղաքականություններին printf(օգտատիրոջ_մուտք)-նման նախշեր մասշտաբով

SAST օգնում է ձախ տեղաշարժվել. այն հայտնաբերում է ձևաչափման սխալները մշակման կամ CI-ի ընթացքում, նախքան դրանք կարող են առաջացնել աշխատանքային ժամանակի խնդիրներ կամ անվտանգության միջադեպեր:

TL. DR: Guardrails > Ձեռքով վերանայում Արագ շարժվող թիմերին անհրաժեշտ է SAST գործել որպես անվտանգության ցանց, որը հասկանում է համատեքստը, հետևում է մուտքագրման հոսքին և արգելափակում է վտանգավոր ձևաչափումը միաձուլումից առաջ։

Guardrails Այդ աշխատանքը. ֆորմատով պայմանավորված ձախողումների կանխարգելում

Սկսեք CI-ում ստատիկ ստուգումներից Օգտագործեք գործիքներ, որոնք՝

  • Վերլուծեք տվյալների հոսքը մուտքայինից մինչև ձևաչափիչ
  • Բլոկների միաձուլումը անվտանգ չէ printf օգտագործում
  • Ավելացնել pre-commit hooks տողերի ձևաչափման համար

Դադարեք օգտագործել Raw-ն printf(օգտատիրոջ_մուտք) Օգտագործեք ավելի անվտանգ մոդելներ.

Python-ում

Java-ում

Փաթեթավորեք ձեր ձևաչափի տրամաբանությունը. Ստեղծեք ներքին փաթաթաններ, որոնք՝

  • Մերժել անվստահելի ձևաչափի տողերը
  • Մուտք գործել ձևանմուշներով
  • Փորձարկելի և աուդիտի ենթակա են

Մի՛ հույսդ դնեք մշակույթի վրա, ավտոմատացրեք այն։ Մարզեք ձեր թիմը, բայց աջակցեք այն CI-ի կիրառմամբ և SAST.

DevSecOps-ը գործողության մեջ. Ինչպես է Xygeni-ն կանխում ձևաչափման սխալները նախքան դրանց տեղակայումը

Ձևաչափի սխալներ, որոնք հայտնաբերվել են այնտեղ, որտեղ կարևոր է. CI-ում, Քսիգենի ակտիվորեն սկանավորում է պահոցները վտանգավոր ձևաչափման ձևերի համար, ինչպիսիք են՝

  • printf(օգտատիրոջ_մուտք) Python-ում
  • System.out.printf(օգտատիրոջ մուտքագրում) Java-ում

Սրանք նշված են որպես բարձր ռիսկային, քանի որ թույլ են տալիս Python-ի օգտատիրոջ մուտքագրումը և Java printf-ի չարաշահումը՝ ձևաչափման շարժիչներում վարքագիծ սահմանելու համար։

Իրական ժամանակում արգելափակում CI մատակարարների միջև։ Երբ ինտեգրվում է GitHub Actions-ի հետ, GitLab-ը CI/CD, Բիթբաքեթ Pipelines-ի կամ Jenkins-ի դեպքում, Xygeni-ն դադարեցնում է միաձուլումը նախքան կոդի հրապարակումը։ Մշակողը ստանում է անհապաղ, համատեքստային ծանուցում, որը ցույց է տալիս՝

  • Հստակ ֆայլը և տողը, որտեղ հայտնվում է խոցելիությունը
  • Խնդրի հստակ բացատրություն (օրինակ՝ «ֆորմատի տողում չհաստատված մուտքագրում»)
  • Առաջարկվող գործողություններ այն շտկելու համար

Այս վաղաժամ արգելափակումը Xygeni-ն հաշվետվությունների գործիքից վերածում է միաձուլման դարպասապահի։ Հետմահու ահազանգերի կամ անորոշ եզրակացությունների փոխարեն, դուք ստանում եք կիրառելի անվտանգության կանոններ ամենակարևոր պահին։

Համատեքստային սկանավորում. Բանալի բառերով որոնումներից տարբերվող Xygeni-ն վերլուծում է տվյալների հոսքը՝ հասկանալու համար, թե արդյոք ձևաչափի տողերը ծագում են Python-ի օգտատիրոջ մուտքագրումից: Այն կարող է տարբերակել անվտանգ ներքին տողերը արտաքին տվյալներ պարունակողներից:

Ինչու է սա կարևոր. Մշակողներին ավելի շատ աղմուկ պետք չէ։ Նրանց անհրաժեշտ են խելացի, գործնական գործիքներ։ Xygeni-ն առաջարկում է նախնականcisէլեկտրոնային հայտնաբերում և կիրառում իրական ժամանակում guardrails որտեղ դրանք հաշվվում են, ձեր CI-ում pipeline, Ստուգե՛ք:

TL;DR – Փոքր միջատ, մեծ խառնաշփոթ. Մի՛ printf(օգտատիրոջ_մուտք)

Այս մեկ տողը կարող է.

  • Կոտրեք CI-ն
  • Կոռումպացված գրանցամատյաններ
  • Առաջացնել կատարման ժամանակի բացառություններ

Եվ այն դեռ կհայտնվի 2025 թվականին։

Իրական ռիսկերը

Ռիսկ Ինչու է դա տեղի ունենում Ինչպես ամրագրել այն
CI կառուցվածքները և գրանցամատյանները խափանվում են Ձևաչափման տոկենները խաթարում են արդյունքը Խուսափեք ուղղակի printf(user_input)
Ժամանակակից կայծակաճարմանդները դեռևս խոցելի են Java/Python-ում սխալ օգտագործված ձևաչափի կանչեր Մաքրեք մուտքագրված տվյալները կամ օգտագործեք ավելի անվտանգ API-ներ
IDE-ները և linter-ները բաց են թողնում դա Նրանք չեն հետևում տվյալների հոսքին օգտագործում SAST գործիքներ
Վտանգավոր կոդը միավորվում է Վերանայումները կարող են բաց թողնել ձևաչափի թերությունները Օգտագործեք Xygeni-ի նման գործիքներ CI-ում

Մշակողի ստուգաթերթիկ

  • Մի՛ փոխանցեք օգտատիրոջ մուտքագրված տվյալները անմիջապես ձևաչափի տողերի մեջ
  • Մաքրեք կամ խուսափեք օգտատիրոջ մուտքագրումներից
  • Օգտագործեք անվտանգ մեթոդներ.
    • python: logging.info(“%s”, օգտատիրոջ_մուտք)
    • Java: MessageFormat.format()
  • Օգտագործում SAST գործիք, որը հասկանում է մուտքային հոսքը
  • Պարտադրել guardrails CI-ում

Վերջնական խոսքը. Սա պարանոյայի մասին չէ, այլ պատրաստվածության։ Ձևաչափի սխալները հեշտ են ներմուծվում և վնասակար են, եթե անտեսվում են։ Կանգնեցրեք դրանք, նախքան դրանք ի հայտ կգան։

sca-tools-software-composition-analysis-tools
Առաջնահերթություն տվեք, շտկեք և պաշտպանեք ձեր ծրագրային ռիսկերը
Ստացեք ձեր անվճար հաշիվը։
Ոչ մի վարկային քարտ չի պահանջվում:

Ապահովեք ձեր ծրագրային ապահովման մշակումը և մատակարարումը

Xygeni Product Suite-ի հետ