๐ง๐ป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! ๐
