ํผ์ง์ด๋
ํผ์ฆ(Fuzz) ๋๋ ํผ์ง(Fuzzing)์ด๋ ๋ธ๋๋ฐ์ค ํ ์คํธ ์ ํ ๋ฐฉ๋ฒ์ผ๋ก ์ ์/๋น์ ์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ํจ์๋ API์ ์ ๋ฌํ๋ค.ย ์ด๋ป๊ฒ ๋ณด๋ฉด ์ํธ ํด๋ (crypto anaylysis) ๊ณผ์ ๊ณผ ๋น์ทํ๊ฒ ๋ณด์ด์ง๋ง ํผ์ง์ ํ๋กํ ์ฝ์ด๋ ์ ๋ ฅ ๋ฐ์ดํฐ ํ์ ์ ์์กด์ ์ด๋ค. ๊ทธ๋์ ์คํจํ ํ ์คํธ ๊ฒฐ๊ณผ๋ค์ ์ํธย ํด๋ ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ค์ ๋ก ์ ์๋ฏธํ๋ค.
์ฌ๋ด์ผ๋ก ๋ช๋ ์ ๋๊ธฐ์ ์์๋ ์ ์ฌํ ํ ์คํธ๋ฅผ ์ํํ๊ธฐ ์ํด์ ์ ๋ฌธ ์ธ๋ ฅ๊น์ง ๋์์๋ค. ๊ทธ๋๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ธด ํ์ง๋ง ํ ์คํธ ์ค์ ๋ถํฐ ์ํ ํ ๋ณด๊ณ ์ ์์ฑ๊น์ง ์๋นํ ๋ง์ ๋ถ๋ถ์์ ๊ณ ๊ธ ์ธ๋ ฅ๋ค์ ํฌ์ ํ์๋๋ฐ, ์ด๋ฒ์ ๋ฐ๊ฒฌํ ๋๊ตฌ๋ ๋ง์ฝ ํ ์คํธ ๋์์ด Rest API์ด๊ณ Open API ์คํ (i.e. swagger)์ ๊ฐ์ง๊ณ ์๋ค๋ฉด CI/CD์ ๋ฐ๋ก ์ฐ๋ํ๊ณ ๋ฐ๋ก ๊น๋ํ ๋ฆฌํฌํธ๋ฅผ ํ์ธํ ์ ์์ ์ ๋๋ก ๊ณ ๋ํ ๋์๋ค. ์ํํธ์จ์ด ํ ์คํธ์ชฝ์ ์ ๋ง ๋น ๋ฅด๊ฒ ์ปดํจํฐ๋ก ๋์ฒด๋์ด๊ฐ๊ณ ์๋ ๊ฒ ๊ฐ๋ค.
CATS
https://github.com/Endava/cats
CATS๋ ์๋ฐ ๊ธฐ๋ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฑฐ์ ์ฝ๋ฉ์ ํ์ง ์๊ณ ๋ ๋ช๋ฐฑ๊ฐ์ง์ APIํ ์คํธ๋ฅผ ์๋์ผ๋ก ์ํํด์ค๋ค. 6.0 ๋ฒ์ ๊ธฐ์ค์ผ๋ก 76๊ฐ์ ํผ์ (Fuzzer)๊ฐ ์กด์ฌํ๋ค.
ํผ์ ๋ ํฌ๊ฒ 5๊ฐ์ง๋ก ๋ถ๋ฅ๋๋ค
ํ๋ ํผ์ – Post ์์ฒญ์ ๋ชธํต์ด๋ URL์ ๊ฒฝ๋ก ๋ณ์(path variable)์ ๋์์ผ๋ก ํ๋ ํผ์ ํค๋ ํผ์ - HTTP ํค๋๋ค์ ๋์์ผ๋กํ๋ ํผ์ HTTP ํผ์ - ํ๋๋ ํค๋์ ๊ด๊ณ์๋ HTTP ์์ฒญ์ ๋์์ผ๋กํ๋ ํผ์ API ๊ณ์ฝ ๊ฒ์ฆ ํผ์ – Open API ์ ์๊ฐ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ๋ฐ๋ฅด๊ณ ์๋์ง ๊ฒ์ฌํ๋ ํผ์ .ํน์ ํผ์ -ย๋ณด์์ด๋ ํน๋ณํ ์ ์ฐจ๋ฅผ ํ์๋ก ํ๋ ์กฐ๊ธ ๋ ๋ณต์กํ ํ๋๋ค์ ํ ์คํธํ๊ธฐ ์ํ ํผ์
ํ์์ ๊ด๋ฆฌ์ค์ธ ๋ด๋ถ API๋ ์ด๋ฏธ swagger 2.0 ์ผ๋ก ๊ด๋ฆฌ๋๊ณ ์์๊ธฐ ๋๋ฌธ์ CATS jar๋ฅผ ๋ค์ด ๋ฐ์ ๋ค ์์ฃผ ๊ฐ๋จํ๊ฒ ํ ์คํธ๋ฅผ ์คํํ ์ ์์๋ค.
cats.jar --contract=swagger.yaml --server=$FUZZ_SERVER_ADDR --headers=header.yml --refData=refData.yml
์ํ๋ผ์์์ ๋ด๋ถ API ์ธ์ฆ์ JWTํ ํฐ์ ์ผ์ข ์ธ ASAP์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ API ํธ์ถ์ Authorization ํค๋๋ฅผ ์ ๊ณตํด์ค์ผ ํ๋ค. herader.yml ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค. CI/CD์์๋ ๋งค ๋น๋๋ง๋ค ๊ฐ์ ๊ฐฑ์ ์์ผ์ค๋ค.
all:
Authorization: Bearer TOKEN_PLACE_HOLDER
๊ทธ ๋ค์์ด ๋ฐ์ดํฐ ํ์ผ๋ก API์ ๋น์ฆ๋์ค ํน์ ์ ๊ฐ์ ์ ๊ณตํ๋ค. ์ฌ๊ธฐ์๋ ๊ฐ๋จํ ๊ณ ์ ๋ ๊ฐ์ ์ฌ์ฉํ์ง๋ง Apache Common์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฑ๋ ํธ์ถ์ด ๊ฐ๋ฅํด ๋ณด์ธ๋ค.
all:
boardId: 29c3fd3c-0239-3cbb-ac02-3ef08e267d4f
columnId: 52
์ด๊ฒ์ผ๋ก ๊ธฐ๋ณธ์ ์ธ ์ค๋น๋ ๋ชจ๋ ๋์ด๋ค. ๋ก์ปฌ์์ ๋์๊ฐ๋ ๊ฒ์ ํ์ธํ๊ณ ๋ฐ๋ก Bitbucket Cloud ์ custom Pipe๋ฅผ ์์ฑํด CATS jar๋ฅผ ํฌํจํ๋ ๋์ปค์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ค API ๋ฆฌํฌ์งํ ๋ฆฌ์ ํ์ดํ๋ผ์ธ์์ ์ผ์ฃผ์ผ์ ํ๋ฒ์ฉ ํ ์คํธ๊ฐ ์ํ๋๋๋ก ์ค์ ํด ๋์๋ค. Github Action์ ์ฌ์ฉํด์๋ ์ ์ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ผ๋ฆฌ๋ผ ์๊ฐํ๋ค.
ํ ์คํธ ๊ฒฐ๊ณผ
์ค์ ๋ด๊ฐ ๊ด๋ฆฌํ๊ณ ์๋ API๋ ๋ค์๊ณผ ๊ฐ์ ํ ์คํธ๋ค์ด ์คํจํ๋ค. ์คํจํ ๋ชจ๋ ํ ์คํธ๋ค์ ์์ ํ์ง๋ ์์ ๊ฒ ์ด๋ค. ์๋ง REST API๊ฐ ์ธ๋ถ์ ๊ณต๊ฐ๋ ๊ฒ์ด๋ผ๋ฉด ๋๋จํ ์ ์ฉํ ๊ฒ ๊ฐ๋ค.
๊ถ์ฅ๋๋ ๋ณด์ ํค๋๋ฅผ ์ฐพ์ ์ ์์
๊ถ๋น๋๋ ํค๋๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์๋ฌ,ย ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ์ ์๊ณ ย ์ฌ์ค API์ด๊ธฐ ๋๋ฌธ์ย ์ด๋ ๋ฌด์ํด๋ ์ข์ ๊ฒ ๊ฐ๋ค.ย ย [{name=X-XSS-Protection, value=1; mode=block}]
X-XSS-Protection – Preventing Cross-Site Scripting Attacks – KeyCDN
์ค๋ณต๋ ํค๋์ ๋ ฅ
์ค๋ณต๋ ํค๋์ ๋ ฅ์ ํ์ฉํ๊ณ ๋ด๋ถ์ ์ผ๋ก๋ ๋ฆฌ์คํธ๋ก ๋ณํ๋๊ณ ์์. HTTP ์คํ์์๋ ํ์ฉ๋์ง๋ง ๋ณด์์ ๊ถ์ฅ๋์ง ์์.
HTTP Desync Attacks in the Wild and How to Defend Against Them | Imperva
์ ๋์ฝ๋ ์ ์ด ๋ฌธ์๋ฅผ ์ธ์ํ์ง ๋ชปํจ
์ ๋์ฝ๋ ์ ์ด๋ฌธ์๋ ์๊ฐ์ ์ผ๋ก ํํ๋๋ ๋ฐ์ดํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ์ ํฌํจ๋์ด ์์ ๊ฒฝ์ฐ์ ์ผ๋ฐ ๋ฌธ์๊ฐ ์๋๋ผ ์ ์ด๋ฌธ์๋ก ์ธ์๋์ด์ผ ํ๋ค.
๊ถ์ฅ๋๋ REST API ๋ค์ด๋ฐ ๊ท์น์ ๋ฐ๋ฅด์ง ์์
API๊ฒฝ๋ก์ ๋ณต์ํ, ๋ช ์ฌ, ์๋ฌธ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ ์๋ํฌ์ธํธ์๋ ์ค๋ค์ดํฌ ์ผ์ด์ค๋ ์ผ๋ฐฅ ์ผ์ด์ค๋ฅผ ์ฌ์ฉํด์ผํ๋ค.ย JSONย ํ๋กํผํฐ์๋ ์ค๋ค์ดํฌ ์ผ์ด์ค์ ์นด๋ฉ ์ผ์ด์ค๋ฅผ ํ์ฉํจ.
์๋ก์ด JSON ํ๋ ์ ๋ ฅ์ ํ์ฉํจ
์์ฒญ์ ๋ชธํต์ ์๋ก์ด JSON ํ๋ ์ ๋ ฅ์ ํ์ฉํ๊ณ ์๋๋ฐ OWASP ์์๋ ์ด๊ฒฝ์ฐ์ ์์ฒญ์ ๊ฑฐ์ ํ๋๋ก ๊ถ์ฅํ๋ค.
REST Security – OWASP Cheat Sheet Series
์กด์ฌํ์ง ์๋ HTTP ๋ฉ์๋์ ๋ํด์ 405(Method Not Allowed)๋ฅผ ๋ฐํํ์ง ์์
์ ๋ชฉ ๊ทธ๋๋ก CONTENT์ ๊ฐ์ด ์กด์ฌํ์ง ์๋ HTTP ๋ฉ์๋์ ๋ํด 403 ์๋ฌ๋ฅผ ๋ฐํํ๊ณ ์๋ค.
์ง์ํ์ง ์๋ Content Types ํค๋๋ฅผ ํ์ฉํจ
Content-Type ํค๋์ OpenAPI ๊ณ์ฝ์ ์ ์๋์ง ์์ ๊ฐ์ ๋ณด๋์ ๋ ์์ฒญ์ ํ์ฉํจ. OWASP ๋ ๊ฒ์ฆ์ ์ํํ๋๋ก ๊ถ์ฅํ๋ค.
REST Security – OWASP Cheat Sheet Series
API ์ฌ์์ ๊ถ์ฅ๋๋ HTTPํค๋๊ฐ ์กด์ฌํ์ง ์์
API ์ฌ์์ GET ๊ฒฝ๋ก์ ๊ถ์ฅ๋๋ ํค๋์ธ TracedId/CorrelationId๊ฐ ์กด์ฌํ์ง ์์.
๋ง์น๋ฉฐ
์ค์ jar ํ์ผ์ ๋ค์ด๋ฐ์์ ๋ก์ปฌ์์ ์คํํด ๋ณด๋๋ฐ๋ ํ์๊ฐ๋ ๊ฑธ๋ฆฌ์ง ์์๋ค. Open API ์คํ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ฐ๋์ ๋๋ ค๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. CATS์์ ์ข ์์ฌ์ด ์ ์ ํ ์คํธ ๊ฐฏ์๊ฐ ์์ฒญ๋๊ฒ ๋ง์๋ฐ ๋นํด ํด๋ผ์ด์ธํธ ์ธก Rate limiting ์ด๋ Throttling ๊ธฐ๋ฅ์ด ์์ด์ผ ํ ๊ฒ ๊ฐ๋ค. ๋ง์ API ์๋ต์ด 503 ์๋ฌ๋ฅผ ๋ฐํํด์ ์๋์น ์๊ฒ ์ฑ๋ฅ ํ ์คํธ๊ฐ ๋์ด๋ฒ๋ฆด ์๋ ์๋ค.











