(์‚ฌ์ด๋ฒ„๋ณด์•ˆ 23๊ฐ•) ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ์˜ ๋ณด์•ˆ Coding Tip

๐Ÿง‘‍๐Ÿ’ป23๊ฐ• ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ์˜ ๋ณด์•ˆ Coding Tip

๋ณด์•ˆ, ๋ณด์•ˆ ํ•˜๋”๋‹ˆ... ๊ฒฐ๊ตญ ๋‚ด ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ์˜€๋‹ค๊ณ ์š”? ๐Ÿ˜ฑ
์˜ค๋Š˜์€ ๊ฐœ๋ฐœ์ž์˜ ์†๋์—์„œ ์ถœ๋ฐœํ•˜๋Š” Secure Coding์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€ ๋ด…์‹œ๋‹ค!


๐Ÿงจ “์ด ์ฝ”๋“œ๊ฐ€ ๋ญ ์–ด๋•Œ์„œ์š”?” → ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋์Šต๋‹ˆ๋‹ค!

๋ณด์•ˆ ์‚ฌ๊ณ ์˜ ์ƒ๋‹น์ˆ˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ ํ•œ ์ค„์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
์ „ ์„ธ๊ณ„์ ์œผ๋กœ๋„ ์ฝ”๋”ฉ ๋ฏธ์Šค + ๋ณด์•ˆ ๋ฌด์ง€ = ์ทจ์•ฝ์ ์ด๋ผ๋Š” ๊ณต์‹์ด ์ˆ˜์—†์ด ์ž…์ฆ๋˜์—ˆ์ฃ .

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ์Šต๊ด€์ด ์œ„ํ—˜ํ•œ๊ฐ€์š”?
๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋‚ด ์ฝ”๋“œ๋ฅผ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ์š”?


๐Ÿ”‘ ์•ˆ์ „ํ•œ ์ฝ”๋”ฉ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ˆ˜์น™

๋ณด์•ˆ ์ฝ”๋”ฉ์€ ๋ญ”๊ฐ€ ํŠน๋ณ„ํ•œ ๊ธฐ์ˆ ์ด ์•„๋‹™๋‹ˆ๋‹ค.
๊ธฐ๋ณธ๊ธฐ๋ฅผ ํŠผํŠผํžˆ ์ง€ํ‚ค๋Š” ์Šต๊ด€์ด ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ์˜ˆ์š”.

๐Ÿ“Œ 1. ์ž…๋ ฅ๊ฐ’์€ ์ ˆ๋Œ€ ๋ฏฟ์ง€ ๋งˆ๋ผ!

  • ๋ฌธ์ œ ์‚ฌ๋ก€:
    char buf[10];
    gets(buf); // ์ž…๋ ฅ๊ฐ’ ๊ธธ์ด ์ œํ•œ ์—†์Œ = ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ
  • ๋Œ€์‘ ํŒ: fgets(), strncpy() ๋“ฑ ๊ธธ์ด ์ œํ•œ ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • ์‹ค์ œ ์‚ฌ๋ก€:
    → 2005๋…„ Jeep ์ฐจ๋Ÿ‰์˜ ์ธํฌํ…Œ์ธ๋จผํŠธ ์‹œ์Šคํ…œ์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ทจ์•ฝ์  ๋ฐœ์ƒ,
    ์™ธ๋ถ€ ํ•ด์ปค๊ฐ€ CAN ํ†ต์‹ ๋ง๊นŒ์ง€ ์นจํˆฌ!

๐Ÿ“Œ 2. ํฌ์ธํ„ฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์ฒ ์ €ํžˆ!

  • ๋ฌธ์ œ ์‚ฌ๋ก€:
  • free(ptr); ... *ptr = 0x1234; // Use-after-free
  • ๋Œ€์‘ ํŒ:
    • free() ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ptr = NULL
    • ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ(C++ ์‚ฌ์šฉ ์‹œ) ๊ณ ๋ ค

๐Ÿ“Œ 3. ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ช…ํ™•ํžˆ!

  • ๋ฌธ์ œ ์‚ฌ๋ก€:
    if (flag = 1) { ... } // ์กฐ๊ฑด์ด ์•„๋‹ˆ๋ผ ํ• ๋‹น!
  • ๋Œ€์‘ ํŒ:
    • ๋น„๊ต๋Š” ํ•ญ์ƒ ์ขŒ๋ณ€์— ์ƒ์ˆ˜๋ฅผ ๋‘๋Š” ์Šต๊ด€
      ์˜ˆ: if (1 == flag) → ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‹ค์ˆ˜ ๊ฐ์ง€ ๊ฐ€๋Šฅ

๐Ÿ“Œ 4. MISRA-C ๊ฐ™์€ ์ฝ”๋”ฉ ๊ทœ์น™ ํ™œ์šฉ

  • ์žฅ์ :
    • ์•ˆ์ „์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ ๋ชจ๋‘๋ฅผ ์ปค๋ฒ„
    • Static Analysis ํˆด๊ณผ ์—ฐ๊ณ„ ๊ฐ€๋Šฅ
  • ์ถ”์ฒœ ํ•ญ๋ชฉ:
    • Rule 21.6: sprintf() ๋Œ€์‹  snprintf() ์‚ฌ์šฉ
    • Rule 9.1: ์„ ์–ธ ์ „์— ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”

๐Ÿ” ์‹ค์ œ ๋ฒ„๊ทธ ์‚ฌ๋ก€ ๋ถ„์„ – “๊ทธ๋•Œ ๊ทธ ์ฝ”๋“œ๊ฐ€…”

๐Ÿ“Œ ์‚ฌ๋ก€ 1: OTA ์—…๋ฐ์ดํŠธ์—์„œ์˜ ๊ฒฝ๋กœ ์กฐ์ž‘ ์ทจ์•ฝ์ 

  • ๋ฌธ์ œ ์ฝ”๋“œ:
    char path[128];
    sprintf(path, "/tmp/%s", user_input); // ์™ธ๋ถ€ ์ž…๋ ฅ ์ง์ ‘ ํฌํ•จ
  • ์ทจ์•ฝ์ : ์ƒ๋Œ€ ๊ฒฝ๋กœ ์กฐ์ž‘ ๊ฐ€๋Šฅ → /etc/passwd ๋ฎ์–ด์“ฐ๊ธฐ ๊ฐ€๋Šฅ์„ฑ
  • ๊ฐœ์„ :
    • ์ž…๋ ฅ ๊ฒ€์ฆ + ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์ฒดํฌ
    • realpath() ๋“ฑ์œผ๋กœ ๊ฒฝ๋กœ ์ •๊ทœํ™”

๐Ÿ“Œ ์‚ฌ๋ก€ 2: CAN ๋ฉ”์‹œ์ง€ ํŒŒ์‹ฑ์—์„œ์˜ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ์˜ค๋ฅ˜

  • ๋ฌธ์ œ ์ฝ”๋“œ:
    uint8_t data[8];
    uint8_t len = msg->dlc;
    for (int i = 0; i <= len; i++) 
    { data[i] = ...; } // off-by-one
  • ๋ฌธ์ œ์ : ์ตœ๋Œ€ 8๋ฐ”์ดํŠธ์ธ ๋ฐฐ์—ด์—์„œ 9๋ฒˆ์งธ ์ ‘๊ทผ ๋ฐœ์ƒ
  • ๊ฐœ์„ : i < len ์กฐ๊ฑด ์‚ฌ์šฉ + dlc ๊ฒ€์ฆ ์ถ”๊ฐ€ ํ•„์š”

๐Ÿค“ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋ณด์•ˆ ์ฝ”๋”ฉ ์š”์•ฝ Check List

ํ•ญ๋ชฉ์„ค๋ช…

๐Ÿ” ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ์™ธ๋ถ€/๋‚ด๋ถ€ ๊ตฌ๋ถ„ ์—†์ด ๋ชจ๋‘ ํ•„์ˆ˜
๐Ÿงผ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ free ํ›„ null, stack size ์ฃผ์˜
๐Ÿง  ๋ช…ํ™•ํ•œ ์กฐ๊ฑด๋ฌธ == vs = ์‹ค์ˆ˜ ๋ฐฉ์ง€
๐Ÿงพ ์ฝ”๋”ฉ ๊ทœ์น™ MISRA, CERT-C ์ ์šฉ ๊ถŒ์žฅ
๐Ÿ›  ํˆด ํ™œ์šฉ SAST, Lint, ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ  ๋ฌด์‹œ ๊ธˆ์ง€!

๐Ÿ’ก ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ˜„์‹ค์ ์ธ ์กฐ์–ธ

  • ์ฝ”๋“œ๋ฅผ ์“ธ ๋•Œ “๋‚ด๊ฐ€ ๊ณต๊ฒฉ์ž๋ผ๋ฉด ์–ด๋””๋ฅผ ์ฐŒ๋ฅผ๊นŒ?” ๊ณ ๋ฏผํ•ด๋ณด์„ธ์š”.
  • ๋ณด์•ˆํŒ€๊ณผ ์นœํ•ด์ง€์„ธ์š”. ์„œ๋กœ ๋ง์ด ํ†ตํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.
  • Secure Coding์€ ์ผํšŒ์„ฑ์ด ์•„๋‹™๋‹ˆ๋‹ค.
    ๊ณ„์† ๋ฐฐ์šฐ๊ณ , ๋ฐ˜๋ณตํ•˜๊ณ , ์ž๋™ํ™” ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์›€์ง์ด์„ธ์š”!

โœจ ๋งˆ๋ฌด๋ฆฌ ํ•œ๋งˆ๋””

“๋ณด์•ˆ์€ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋‹ค. ์Šต๊ด€์ด๋‹ค.”

๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ•˜๋ผ๋Š” ๋ง,
์ด์ œ๋Š” ์˜›๋ง์ž…๋‹ˆ๋‹ค.
๋ณด์•ˆ ์ฝ”๋”ฉ์€ ์„ ํƒ์ด ์•„๋‹ˆ๋ผ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์‹œ์ž‘์€...
๋‹น์‹ ์˜ ์ฝ”๋“œ ํ•œ ์ค„์ž…๋‹ˆ๋‹ค.


๐Ÿ”œ ๋‹ค์Œ ์‹œ๊ฐ„ ์˜ˆ๊ณ 

๐Ÿš— ์ž๋™์ฐจ ๋ณด์•ˆ ์นจํ•ด ์‹œ๋‚˜๋ฆฌ์˜ค ์‚ฌ๋ก€ ๋ถ„์„

  • ์‹ค์ฐจ์—์„œ ๋ฐœ์ƒํ•œ ํ•ดํ‚น ์‹œ๋„๋“ค
  • ์–ด๋–ค ์ทจ์•ฝ์ ์ด ์–ด๋–ป๊ฒŒ ๋šซ๋ ธ๋‚˜?
  • ๋ฐฉ์–ด ๋ฐฉ๋ฒ•์€?

๋‹ค์Œ ์‹œ๊ฐ„์—” ๊ณต๊ฒฉ์ž์˜ ์‹œ์„ ์œผ๋กœ ์ž๋™์ฐจ ๋ณด์•ˆ์„ ๋ถ„์„ํ•ด ๋ด…๋‹ˆ๋‹ค!
๊ถ๊ธˆํ•˜์‹œ์ฃ ? ๊ทธ๋Ÿผ… See you next time! ๐Ÿ‘‹

๋ฐ˜์‘ํ˜•