ᾓ"OESPJE+"7"Ⳳ၊צྖᓢᴶ◖ᵫ῾ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
ῶέဓὢ⤞Ѯ↋ᏽⱊⷲ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
૮ം⤞ᆚҫ၊⁞ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ ῶ૮ം⤞ᆚҫ၊⁞ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞
ῶ"1*ᴳẗ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
OVMMᇒЊᒮᨆᏦѮᢚ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ FRVBMT ḮIBTI$PEF ⵆࢆᆺ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞
ῶᓢᴶ⪧ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
؞Ꮾ ᓢᨊⵊ⤻᪒⪦ῲᦏ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ ◖ᵫⵊᵂ⸦⹂ᴺӎᆚↆᢚẗ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ `ῶⵆ↮ᴸἮࢊᨆЀᢚẗ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ ῲᷛ`Ἢ၊תϮઓⵊ⫺Ὢ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ Ṧᕮᶾᤊתⵆᷚ⹊⹂Ϯઓⵊ⛢⯚ࣺ⪦ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ ӣἎᴲὢംᶾⵊת ᶢ⦣Ӫ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞
ῶ᫊ϲᏽ⣊ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
ҫᾯ⁞ѢѮᢚ᫊῾Ӫᢚẗ᫊῾ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ ૮၊ ᶢఆ↮ᴸἮᾚ֮ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞
ῶᶾ࿚⒆ᆚ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
Ḓᅆቂ᫊↮⦣ⵊ ᓢ०▊ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ Ḓᅆ⹗ᶾ૮ⵊ⒆ᆚᕮᾚ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞
ῶ❂ೊⱶ↶ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
ࣾ⯚ὦ⤞ᷛ␦⁞ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞
ῶ⚏⹂ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
ӣẗቂೊ၊ᕮ⤞ᆚ⤢ఊQSJWBUFᐞᷢἎ⸃ⴲೊ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ QSJWBUFᐞᷢἎ⸃ⴲೊᶾӣẗὢ⤞ⵎ૧ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞ ᫊᪒⥊ὢ⤞ ᓢ৲▊ ⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞⾞
ᾓẗᶢ ᆚᏽᵫᶢⱊ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
ῶẗᶢ ᆚ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
ῶᵫᶢⱊ ⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞
⾞⾞⾞⾞ᕲᅆ
◖ᵫ῾ታ♛
Ỳⷆல
CWE-ID
έဓὢ⤞
Ѯ↋ᏽⱊⷲ
૮ം⤞ᆚҫ၊⁞
ᇒẞঀἺ
CWE-23
ῶ૮ം⤞ᆚҫ၊⁞
ᇒẞঀἺ
CWE-36
API
ᴳẗ
null
ᇒЊᒮᨆᏦѮᢚ
ঀἺ
CWE-398
equals()ḮhashCode()
ⵆࢆᆺ
ঀἺ
CWE-581
ᓢᴶ⪧
؞Ꮾ ᓢᨊⵊ⤻᪒⪦ῲᦏ
ঀἺ
CWE-319
◖ᵫⵊᵂ⸦⹂ᴺӎᆚↆᢚẗ
ঀἺ
CWE-327
`ῶⵆ↮ᴸἮࢊᨆЀᢚẗ
ঀἺ
CWE-330
ῲᷛ`Ἢ၊תϮઓⵊ⫺Ὢ
ঀἺ
-Ṧᕮᶾᤊתⵆᷚ⹊⹂Ϯઓⵊ⛢⯚ࣺ⪦
ঀἺ
-ӣἎᴲὢംᶾⵊת ᶢ⦣Ӫ
ঀἺ
-᫊ϲᏽ⣊
ҫᾯ⁞Ѣ:
Ѯᢚ᫊῾Ӫᢚẗ᫊῾
ঀἺ
CWE-367
૮၊ ᶢఆ↮ᴸἮᾚ֮
ঀἺ
CWE-674
ᶾ࿚⒆ᆚ
Ḓᅆቂ᫊↮⦣ⵊ ᓢ०▊
ঀἺ
CWE-209
Ḓᅆ⹗ᶾ૮ⵊ⒆ᆚᕮᾚ
ঀἺ
CWE-390
❂ೊⱶ↶
ࣾ⯚ὦ⤞ᷛ␦⁞
ঀἺ
CWE-476
⚏⹂
ӣẗቂೊ၊ᕮ⤞ᆚ⤢ఊprivate
ᐞᷢ-Ἆ⸃ⴲೊ
ঀἺ
CWE-495
private
ᐞᷢ-Ἆ⸃ⴲೊᶾӣẗὢ⤞ⵎ૧
ঀἺ
CWE-496
᫊᪒⥊ὢ⤞ ᓢ৲▊
ঀἺ
CWE-497
1
ᾓ
Android-JAVA
Ⳳ၊צྖᓢᴶ◖ᵫ῾
1
ῶ έဓὢ⤞Ѯ↋ᏽⱊⷲ
ᢚẗέဓἲѮ↋ᶴὢצ૮၊ᐉᴲᷚᢚẗⵆቢᆼἮᓢᴶỲⷿᶾ०▊ఆѺఊ. ⵢ૧ ᓢᴶ◖ᵫ῾ἲ ᷶ᐗⵆ؞ Ỳⵢᤊં Ἆ⺖ⵊ έဓὢ⤞ᆺ ⶶẗⵎ ᨆ ὶல။ ❂ഗⵆં ѱὢ ⁹Ἢ, ᕮೋὢⵊ ҫẞ έဓЀἲ Ѯ↋ⵆᷚ Ѯ↋ఊ ὢ⤞ᆺ ⶶẗⵆல။ ❂ഗⵆᷚ ◖ᵫ῾ἲ ўⵢᵪⵊ.
1.
૮ം⤞ᆚҫ၊⁞
(Relative Path Traversal)
Ϯ
.
Ṧᕮέဓἲ⦣ⵆᷚ“ം⤞ᆚҫ၊ጦᷢ” ᣋὢⴲẂⵊҫẞ, Ṧᕮέဓᶾᤊҫ၊⁞ ᶾᢚẗఎᨆὶંጦᅪⴲ⤞ᆯⵆ↮ᴸἪቢ, ᷶ᐄᷯᷛᶾ૮ⵊҫ၊ጦᷢὢϮઓ ⵢ…᫊᪒⥊ ᓢ৲▊, ᤊᘲ᪒ᾓᵎἲἎᐊ᫊⢚ᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ Ṧᕮέဓὢ↯⫺Ὢὢᅲἲᣋⵆંᢚẗఎᨆᶴல။ⵊ. ᕶϮⵆѺ↯ᢚẗ ⵆંҫẞ, ᅦം⤞ᆚ⫺Ὢἲתⵎᨆᶴல။replaceAll() ቂೊᅪᢚẗⵆ ᷚỲⷆጦᷢ(",/,\)ἲ ўⵆંⴲ⤞ᅪў♆ல။ⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: ……
2: public void f(Properties request) {
3: ……
4: String name = request.getProperty("filename");
5: if( name != null ) {
6: File file = new File("/usr/local/tmp/" + name);
7: file.delete();
8: }
9: ……
10: }
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: ……
2: public void f(Properties request) {
3: ……
4: String name = request.getProperty("filename");
5: String dentry = "/usr/local/tmp";
6: if ( name != null && !"".equals(name) ) {
7: name = name.replaceAll("/", "");
8: name = name.replaceAll("\\", "");
9: name = name.replaceAll(".", " ");
10: name = name.replaceAll("&", " ");
11: name = name + "-report";
12: File file = new File(dentry + name);
13: if (file != null) file.delete();
14: }
15: ……
16: }
ṦᕮᶾᤊέဓఆંЀᶾ૮ⵆᷚNullᷚᕮᅪ⒢⡚ⵆӎ, Ṧᕮᶾᤊέဓఆં⫺Ὢὢᅲ(name)ᶾᤊ ૮ҫ၊(/, \\, &, . ⪧ᨆጦ)ᅪᤒ ⵎᨆᶴல။replaceAllᅪὢẗⵆᷚ⪧ᨆጦᅪ ўⵊ.
ཪ
.
␦ӎጦⶺ
[1] CWE-23 ૮ം⤞ᆚҫ၊⁞- http://cwe.mitre.org/data/definitions/23.html [2] OWASP Top 10 2010 - (OWASP 2010) A4 Insecure Direct Object Reference
2.
ῶ૮ം⤞ᆚҫ၊⁞
(Absolute Path Traversal)
Ϯ
.
Ṧᕮέဓὢ⫺Ὢ᫊᪒⥊ἲ⁞ⵆંҫ၊ᅪ↯ ᶢⵎᨆὶўࢆᷯⶓἲࡪ♆ቢỲⷆ ⵆ. ᢚẗέဓὢ⫺Ὢ᫊᪒⥊ᶳᶾᢚẗఆંҫ၊ᅪ ᶢⵆંѱἲⶶẗⵆቢ, ӣҗ ϮἿẗⳲ၊צྖᶾ♆ታ`ὦ᫊᪒⥊⫺ὪંὪᐆ⫺ὪἲתⵆўࢆᒮҫⵎϮઓ ὢᾚⵊ. ⅷ, ҫ၊⁞ἲ⦣ⵢᤊӣҗϮⶶẗఆ↮ᴸἮպⵊἲೋⵆᷚ, ᤒ ᶾӮ Ҳఊ⫺Ὢἲᒮҫⵎᨆὶўࢆ᫊⢚ᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ⫺ὪὢᅲἪ၊ᕮ⤞replaceAll ቂೊᅪᢚẗⵆᷚỲⷆⵊጦἲ ўⵆўࢆ, ῶ૮ҫ၊ጦ ᷢ⯚ⵖᷚᕮᅪѮᢚⵖἪ၊᭖ὲം⤞ᆚᶾתⵆ↮ኩⵆல။Ⳳ၊צྖἲⵆ ંѱὢᐂེ↯ⵆ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: ……
2: public void onCreate(Bundle savedInstanceState) {
3: ¦¦¦¦super.onCreate(savedInstanceState);
4: ¦¦¦¦File file = new File(android.os.Environment.getExternalStorageDirectory(), "inputFile");
5: ¦¦¦¦try {
6: ¦¦¦¦¦¦¦¦¦InputStream is = new FileInputStream(file);
7: ¦¦¦¦¦¦¦¦¦Properties props = new Properties();
8: ¦¦¦¦¦¦¦¦props.load(is);
9: ¦¦¦¦¦¦¦¦¦String name = props.getProperty("filename");
10: ¦G ¦¦¦¦¦¦file = new File("/usr/local/tmp/" + name);
11: ¦¦G ¦¦¦¦¦¦file.delete();
12: ¦¦¦¦¦¦¦¦is.close();
13: ¦¦¦¦¦} catch (IOException e) {
14: ¦¦¦¦¦¦¦¦¦¦¦Log.w("Error", "", e);
15: ¦¦¦¦¦}
16: ¦}
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: ……
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4: ¦¦¦¦¦¦¦¦¦
5: File file = new File(android.os.Environment.getExternalStorageDirectory(), "inputFile");
6: try {
7: ¦¦¦¦¦¦¦¦InputStream is = new FileInputStream(file);
8: ¦¦¦¦¦¦¦¦Properties props = new Properties();
9: ¦¦¦¦¦¦¦¦props.load(is);
10: ¦¦¦¦¦¦¦¦String name = props.getProperty("filename");
11: ¦¦¦¦¦¦¦¦if (name.indexOf("/") <0) {
12: ¦¦¦¦¦¦¦¦G G Gfile = new File(name);
13: ¦¦¦¦¦¦¦¦G G Gfile.delete();
14: ¦¦¦¦¦}¦¦¦G
15: ¦G G G G ¦¦¦¦is.close();
16: ¦¦G ¦¦} catch (IOException e) {
17: ¦¦¦¦¦¦¦¦¦¦¦Log.w("Error", "", e);
18: ¦¦¦¦¦}
19: }
Ṧᕮέဓὢ⫺ὪὢᅲἪ၊ᢚẗఎҫẞῶ૮ҫ၊ታὢᢚẗఆ↮ኩⵆல။, ጦᷢὢ"\" ં"/"ἲ⯚ⵖⵆўࢆⵢ૧ጦᷢ၊᫊ⵎҫẞӮဖேᨆἲўᕮⵆંѱὢᐂེ ↯ⵆ.
ཪ
.
␦ӎጦⶺ
[1] CWE-36 ῶ૮ം⤞ᆚҫ၊⁞- http://cwe.mitre.org/data/definitions/36.html [2] OWASP Top 10 2010 - (OWASP 2010) A4 Insecure Direct Object Reference
2
ῶ
API
ᴳẗ
API(Application Programming Interface)ં Ảᷯ⒢ Ḯ ἿẗⳲ၊צྖϲ ⦣ᫎᶾ ᢚẗఆં ᶦᶢࢆቂ᫊↮⸃᫋ંᵫἪ၊, ἿẗⳲ၊צྖЊᐊ᫊Њᐊ⮦ᆚᏽ⺖ἲ ӣⵆં ὢ῾ὢὶ. צ࿚ࢆAPI Ḓẗᏽ◖ᵫ῾ὢᴺဒ↲APIᢚẗἮЊᐊ⺖ᏽἎ↮ᓢᨆ ΅ⵆᏽᓢᴶϯⵊỲⷿẂὦὢఎᨆὶ.
1. null
ᇒЊᒮᨆᏦѮᢚ
(Missing Check for Null Parameter)
Ϯ
.
Java ⱊ⃮ᶾഞᅢቢObject.equals(), Comparable.compareTo() ᏽComparator.compare() ՚ⷲἮᇒЊᒮᨆϮnullὦҫẞ↮ ఊЀἲᐆ⹆ⵢᵪⵊ. ὢᵫἲഞᅢ↮ᴸἪቢ᷶ ؞♆ኩⵊேὢᐊᣋⵎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ Object.equals(), Comparable.compareTo()ӪComparator.compare() ՚ⷲᶾᤊંᇒЊᒮᨆᅪ nullӪᘲԾⵢᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: public void onCreate(Bundle savedInstanceState) {
2: ¦¦¦¦super.onCreate(savedInstanceState);
3: }
4: ¦¦
5: public boolean equals(Object object)
6: {
7: ¦¦¦¦¦return (toString().equals(object.toString()));
8: }
ᇒЊᒮᨆϮnullὦ↮Ѯᢚⵆ↮ᴸᵆ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: public void onCreate(Bundle savedInstanceState) {
2: ¦¦¦¦super.onCreate(savedInstanceState);
3: }
4: ¦¦
5: public boolean equals(Object object)
6: {
7: if(object != null)
8: ¦¦¦¦¦return (toString().equals(object.toString()));
9: else return false ;
ᇒЊᒮᨆϮnullὦ↮ሪ΅Ѯᢚⵊ.
ཪ
.
␦ӎጦⶺ
2. equals()
Ḯ
hashCode()
ⵆࢆᆺ
(Object Model Violation: Just one of equals() and hashCode() Defined)
Ϯ
.
Java ⱊ⃮ᶾഞᅢቢ, JavaЇἮЋ⒢ંЇἮⵢ᫊❂ೊᅪϮ…ᵪⵊ.
ⅷ"a.equals(b) == true"ὢቢ"a.hashCode() == b.hashCode()" ὢᶢᵪⵊ. ഞཪᤊⵊ⡢ ྆᪒ࢢᶾᤊequals()ḮhashCode()ંె՚ⷲⵆўࢆె՚ⷲⵆ↮ᴸᴲᵪⵊ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ⵊ⡢྆᪒ࢢᶾequals()ᅪ ⵆቢhashCode()ல ⵢᵪⵆӎhashCode()ᅪ ⵆቢ equals()ல ⵢᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: ……
2: public void onCreate(Bundle savedInstanceState) {
3: ¦¦¦¦super.onCreate(savedInstanceState);
4: }
5: ¦¦
6: public boolean equals(Object obj) {
7: ¦¦¦¦if (obj == null)
8: ¦¦¦¦¦¦¦¦return false;
9: ¦¦¦¦int i1 = this.hashCode();
10: ¦¦¦¦int i2 = obj.hashCode();
11:
12: ¦¦¦¦if (i1 == i2)
13: ¦¦¦¦¦¦¦return true;
14: ¦¦¦¦else
15: ¦¦¦¦¦¦¦return false;
16: }
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: ……
2: public boolean equals(Object obj) {
3: ¦¦¦¦if (obj == null)
4: ¦¦¦¦¦¦¦return false;
5: ¦¦¦¦int i1 = this.hashCode();
6: ¦¦¦¦int i2 = obj.hashCode();
7: ¦¦
8: ¦¦¦¦if (i1 == i2)
9: ¦¦¦¦¦¦¦¦return true;
10: ¦¦¦¦else
11: ¦¦¦¦¦¦¦¦return false;
12: }
13: public int hashCode() {
14: ¦¦¦¦return new HashCodeBuilder(17, 37).toHashCode();
15: }
equals()ḮhashCode() ኖా ⵢᵪⵊ.
ཪ
.
␦ӎጦⶺ
3
ῶ ᓢᴶ⪧
؞ᓦ`ὦᓢᴶ؞ઓἲპഺંᤦⵊ⃪ϮⴲẂⵆ. ᕮ`ῶⵊᓢᴶ⪧ᢚẗἮḒ⽶ဒ ઓὢࢆᕮϮ`ὦጦ ᅪᕶ࿚Ḛᨆலὶ. ᓢᴶ⪧ᶾંὦ↋, ת ᶢ, ؞Ꮾ, ᵂ⸦⹂, պⵊӮᆚὢ⯚ⵖఊ.
1.
؞Ꮾ ᓢᨊⵊ⤻᪒⪦ῲᦏ
(Cleartext Transmission of Sensitive Information)
Ϯ
.
SWϮᓢᴶӪӮဖఊᏪϾⵊὢ⤞ᅪታᐟⵊ⤻᪒⪦⸃⣊၊⦣ᫎࣾἲ⦣ⵢᤊᓢࢢ ંҫẞ, ὦ↋ᐉ↮ᴸἮ⃪⒢ᶾⵢᤊ᪒શⴿὢὪᶢࢎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ᏪϾⵊ ᓢᅪ⦣ᫎࣾἲ⦣ⵆᷚࢢᓢࢪഺંᐆೊ᫊ᵂ⸦⹂Ӫ ἲўⒾᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: ……
2: public void onCreate(Bundle savedInstanceState) {
3: ¦¦int port = 443;
4: ¦¦String hostname = "hostname";
5: ¦¦Socket socket = new Socket(hostname, port);¦¦¦¦¦¦¦
6: ¦¦InputStream in = socket.getInputStream();
7: ¦OutputStream out = socket.getOutputStream();
8: ¦// Read from in and write to out...
9: ¦in.close();
10: ¦out.close();¦¦¦¦¦¦¦G
11: }
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: ……
2: public void onCreate(Bundle savedInstanceState) {
3: ¦¦int port = 443;
4: ¦¦String hostname = "hostname";
5: SocketFactory socketFactory = SSLSocketFactory.getDefault();
6: ¦¦GSocket socket = socketFactory.createSocket(hostname, , port);¦¦¦¦¦¦¦
7: ¦¦InputStream in = socket.getInputStream();
8: ¦GOutputStream out = socket.getOutputStream();
9: ¦G// Read from in and write to out...
10: ¦Gin.close();
11: ¦Gout.close();¦¦¦¦¦¦¦G
12: }
ᏪϾⵊ ᓢᅪऒ⪦Ẻ⡚ᅪ⦣ⵆᷚᤊᑲᶾῲᦏⵆ؞ῲᶾ╊ⵊ128ᘲ⪦ئὢ⢒ᅪὢ ẗⵆᷚᵂ⸦⹂ⵆંѱὢᐂེ↯ⵆ.
ཪ
.
␦ӎጦⶺ
2.
◖ᵫⵊᵂ⸦⹂ᴺӎᆚↆᢚẗ
(Use of a Broken or Riscky Cryptographic Algorithm)
Ϯ
.
ᓢᴶ`Ἢ၊◖ᵫⵆўࢆỲⷆⵊᵂ⸦⹂ᴺӎᆚↆἲᢚẗⵢᤊંᴶఊ. ⱊ⃮⹂ఆ↮ᵂ⸦⹂ ᴺӎᆚↆἲ ᢚẗⵆં ѱἮ ӣҗϮ ᴺӎᆚↆἲ ᕲᤋⵆᷚ ጢဓ⹂᫊⢚ ᨆ ὶં Ϯઓἲ ঀὪᨆலὶ. ትትḒ྆ఊᵂ⸦⹂ᴺӎᆚↆҫẞં⛢Ⳗ⤞ઓὢⶓఖᶾഞཪ ◖ᵫⵢ↮؞லⵢᤊ, ᷶ῲᶾંⵢளⵆંትᶣलὢѦᆚᴺӎᆚↆὢ♎ὢࢆት᫊ ϲࢢᶾⵢளఆ؞லⵊ. RC2, RC4, RC5, RC6, MD4, MD5, SHA1, DES ᴺӎᆚↆὢᷚ؞ ᶾⵢ૧ఊ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ AES⒆ᓢЃဓⵊᵂ⸦⹂ᴺӎᆚↆἲᢚẗⵆંѱὢᐂེ↯ⵆ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: ……
2: public byte[] encrypt(byte[] msg, Key k) {
3: byte[] rslt = null;
4:
5: try {
6: // DES࢜Ἦᓢᴶᨆ⃮ᴺӎᆚↆἲᢚẗⵆંѱἮᴶῲⵆ↮ᴸ.
7: Cipher c = Cipher.getInstance("DES");
8: c.init(Cipher.ENCRYPT_MODE, k);
9: rslt = c.update(msg);
10: } catch (InvalidKeyException e) {
11: ……
12: }
13: return rslt;
14: }
15: }
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: ……
2: public byte[] encrypt(byte[] msg, Key k) {
3: byte[] rslt = null;
4:
5: try {
6: // ࢜Ἦᓢᴶᨆ⃮DES ᴺӎᆚↆἲঀἮᓢᴶᨆ⃮AES ᴺӎᆚↆἪ၊૮⒢ⵊ.
7: Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
8: c.init(Cipher.ENCRYPT_MODE, k);
9: rslt = c.update(msg);
10: } catch (InvalidKeyException e) {
11: ……
12: }
13: return rslt;
14: }
15: }
◖ᵫⵆӎᴺဒ↲ᴺӎᆚↆ૮ᫎAES ᴺӎᆚↆἲ╊ⵊ128ᘲ⪦ئὢ⢒ᅪὢẗⵆᷚ ᢚẗⵆંѱὢᐂེ↯ⵆ.
ཪ
.
␦ӎጦⶺ
[1] CWE-327 ◖ᵫⵊᵂ⸦⹂ᴺӎᆚↆᢚẗ- http://cwe.mitre.org/data/definitions/327.html [2] OWASP Top 10 2010 - (OWASP 2010) A7 Insecure Cryptographic Storage
[3] SANS Top 25 2010 - (SANS 2010) Porus Defense - CWE ID 327 Use of a Broken or Risky Cryptographic Algorithm
3.
`ῶⵆ↮ᴸἮࢊᨆЀᢚẗ
(Use of Insufficiently Random Values)
Ϯ
.
᷶☏ϮઓⵊࢊᨆᅪᢚẗⵆંѱἮ᫊᪒⥊ᶾ◖ᵫ῾ἲᵪ؞᫊⢖. ᷶☏ᕶϮઓⵊᨙϮ ⴲẂⵊ⹗ᶾᤊ᷶☏Ϯઓⵊࢊᨆᅪᢚẗⵊቢ, ӣҗંSWᶾᤊᣋఆંἺᨙᅪ ᷶ⵆ᫊ᷚ᪒⥊ἲӣҗⵆંѱὢϮઓⵆ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ࢊᨆᐊᣋ؞ᶾᤊseedᅪᢚẗⵆંҫẞᶾં᷶☏ⵆ؞ᶢဒẢᐗᒃἪ၊ᒮҫⵆᷚᢚẗⵆં ѱὢᐂེ↯ⵆ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: ……
2: public double roledice() {
3: return Math.random();
4: }
5: }
java.lang.Math ⡢྆᪒random() ቂೊંseedᅪᾚᤒ ⵎᨆᶴ؞ഺጦᶾỲⷆⵆ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: import java.util.Random;
2: import java.util.Date;
3: ……
4: public int roledice() {
5: Random r = new Random();
6: // setSeed() ቂೊᅪᢚẗⵢᤊrἲ᷶☏ᕶϮઓⵊlong⢮έἪ၊ᤒ ⵊ.
7: r.setSeed(new Date().getTime());
8: // ࢊᨆᣋ
9: return (r.nextInt()%6) + 1;
10: }
11: }
java.util.Random ⡢྆᪒ંseedᅪᾚᤒ ⵆ↮ᴸᴲலᇒᑶᅦࢊᨆᅪᣋⵊ. ഞཪᤊ Random ⡢྆᪒ᅪᢚẗⵆંѱὢᓢᴶῲⵆ.
ཪ
.
␦ӎጦⶺ
[1] CWE-330 `ῶⵆ↮ᴸἮࢊᨆЀᢚẗ- http://cwe.mitre.org/data/definitions/330.html [2] SANS Top 25 2009 - (SANS 2009) Porus Defense - CWE ID 330 Use of Insufficiently
Random Values
4.
ῲᷛ`Ἢ၊תϮઓⵊ⫺Ὢ
(Files under Global Access)
Ϯ
.
⫺Ὢ ᣋ᫊ ᅦ ἿẗⳲ၊צྖὢ תⵎ ᨆ ὶં ὦЀ(MODE_WORLD_READABLE, MODE_WORLD_WRITABLE)ἲᢚẗⵎҫẞᓢᴶὢࢆጢҞὢ♖ⵢఎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ⫺Ὢᶾ૮ⵊתպⵊἮ╊ⵊἪ၊Ἆ↮ఆᶢᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: public void onCreate(Bundle savedInstanceState) {
2: ¦¦¦¦super.onCreate(savedInstanceState);
3: ¦¦¦¦try {
4: ¦¦¦¦¦¦¦¦FileOutputStream fOut = openFileOutput("test", MODE_WORLD_READABLE);
5: ¦¦¦¦¦¦¦¦¦OutputStreamWriter out1 = new OutputStreamWriter(fOut);
6: ¦¦¦¦¦¦¦¦¦out1.write("Hello World");
7: ¦¦¦¦¦¦¦¦¦out1.close();
8: ¦¦¦¦¦¦¦¦¦fOut.close();
9: ¦¦¦¦¦} catch (Throwable t) {
10: ¦¦¦¦¦}
11: }
⫺ὪתպⵊἲMODE_WORLD_READABLEὢᎮ၊ᅦἿẗⳲ၊צྖὢתⵎᨆὶ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: public void onCreate(Bundle savedInstanceState) {
2: ¦¦¦¦super.onCreate(savedInstanceState);
3: ¦¦¦¦try {
4: ¦¦G ¦¦¦¦¦¦FileOutputStream fOut = openFileOutput("test", MODE_PRIVATE);
5: ¦¦¦¦¦¦¦¦OutputStreamWriter out1 = new OutputStreamWriter(fOut);
6: ¦¦¦¦¦¦¦¦out1.write("Hello World");
7: ¦¦¦¦¦¦¦¦out1.close();
8: ¦¦¦¦¦¦¦¦fOut.close();
9: ¦¦¦¦} catch (Throwable t) {
10: ¦¦¦¦}
11: }
Ṧᕮᶾᤊתⵎᨆᶴல။MODE_PRIVATE၊պⵊἲᤒ ⵆᷮ.
ཪ
.
␦ӎጦⶺ
[1] http://developer.android.com/index.html
5.
Ṧᕮᶾᤊתⵆᷚ⹊⹂Ϯઓⵊ⛢⯚ࣺ⪦
(Exported Access to Components)
Ϯ
.
ᴶೊ၊ὢೊᵎ⳺ᆚ⛮ὢ᥆ᶾᤊmanifest.xml ⫺Ὢᶾandroid:exported="true"၊ᤒ ఆ ᶢ ὶં ⛢⯚ࣺ⪦ં Ṧᕮᶾᤊ ⵢ૧ ⛢⯚ࣺ⪦ᶾ ὦ⤾⪦ᅪ ῲⵆᷚ ⹊⹂ ᫊⢚ ᨆ ὶ. ὢҫẞⵢ૧⛢⯚ࣺ⪦ϮẾ྆லⵆ↮ᴸᵆ⹗ᶾᤊᨆἲ᫊ⵖἪ၊᭖ ᫊᪒⥊ᓢᴶᶾ♖ⵢᅪϮ…Ḛᨆὶ. ⵊὢ࿚ⵊᶳẂ⒛ἮேὪⵊὦ⤾⪦ⴲ⤞ᅪ ᢚẗⵆં⛢⯚ࣺ⪦Ϯᷚ࿚Њὦҫẞὦ⤾⪦ᅪཪẞ⫳ⵆંᆚᑲ(resolver) ᵏ⫞ᘲ⫞ ϮேⵆѺఆӎᆚᑲᵏ⫞ᘲ⫞ᅪ⦣ⵢཪẞ⫳ఆંὦ⤾⪦ંSystem ᒖᢚẗպ ⵊἪ၊ᦏᫎIDϮᐂߺᶢῲᦏఆᎮ၊ᓢᴶ♖ⵢỲⷆὢ⛒↲.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ⛢⯚ࣺ⪦ᶾ૮ⵊתպⵊἲṦᕮᶾ ӣⵆ↮ᴸἮѱὢᐂེ↯ⵆ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: <?xml version="1.0" encoding="utf-8"?>
2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3: ¦¦¦¦package="com.example.android.samplesync" android:versionCode="1" an-droid:versionName="1.0">
4: ……
5: ¦<application android:icon="@drawable/icon" android:label="@string/label">
6: ¦¦¦¦¦<service android:name=".syncadapter.SyncService" android:exported="true">
7: ¦¦¦¦¦¦¦¦¦<intent-filter>
8: ¦¦¦¦¦¦¦¦¦¦¦¦¦<action android:name="android.content.SyncAdapter"/>
9: ¦¦¦¦¦¦¦¦¦</intent-filter>
10: ¦¦¦¦¦¦¦¦¦<meta-data android:name="android.content.SyncAdapter"
11: ¦¦¦¦¦¦¦¦¦¦¦¦¦android:resource="@xml/syncadapter"/>
12: ¦¦¦¦¦¦¦¦¦<meta-data android:name="android.provider.CONTACTS_STRUCTURE"
13: ¦¦¦¦¦¦¦¦¦¦¦¦¦android:resource="@xml/contacts"/>
14: ¦¦¦¦¦</service>
15: ¦</application>
16: ¦<uses-sdk android:minSdkVersion="5"/>
17: </manifest>
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: <?xml version="1.0" encoding="utf-8"?>
2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3: ¦¦¦¦package="com.example.android.samplesync" android:versionCode="1" an-droid:versionName="1.0">
4: ……
5: ¦<application android:icon="@drawable/icon" android:label="@string/label">
6: ¦¦¦¦¦<service android:name=".syncadapter.SyncService" android:exported="false">
7: ¦¦¦¦¦¦¦¦¦<intent-filter>
8: ¦¦¦¦¦¦¦¦¦¦¦¦¦<action android:name="android.content.SyncAdapter"/>
9: ¦¦¦¦¦¦¦¦¦</intent-filter>
10: ¦¦¦¦¦¦¦¦¦<meta-data android:name="android.content.SyncAdapter"
11: ¦¦¦¦¦¦¦¦¦¦¦¦¦android:resource="@xml/syncadapter"/>
12: ¦¦¦¦¦¦¦¦¦<meta-data android:name="android.provider.CONTACTS_STRUCTURE"
13: ¦¦¦¦¦¦¦¦¦¦¦¦¦android:resource="@xml/contacts"/>
14: ¦¦¦¦¦</service>
15: ¦</application>
16: ¦<uses-sdk android:minSdkVersion="5"/>
17: </manifest>
android:exported ἲ"false"၊ᤒ ⵆўࢆᤒ ἲ ўⵆቢⵢ૧ὢ"false"Ϯఆᶢ Ṧᕮ၊ᕮ⤞՚ேὢ␖ఊ.
ཪ
.
␦ӎጦⶺ
[1] http://developer.android.com/index.html
6.
ӣἎᴲὢംᶾⵊת ᶢ⦣Ӫ
(Access Control Bypass using Share User ID)
Ϯ
.
Manifest.xml ⫺Ὢmanifest ⣊צᶾandroid:sharedUserId ἲ ᤒ ⵎ ҫẞ ЇἮ ᴲὢംḮᤊታἲᢚẗⵖἪ၊᭖ᅦἿẗⳲ၊צྖὢⵢ૧Ⳳ၊צྖ ᓢᅪתⵎᨆ ὶѺఊ. ὢᅪ⦣ⵆᷚல`ᏽᘲல`Ἢ၊ⵢ૧Ⳳ၊צྖጢҞӪᓢᴶὢ♖ ⵢఎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ӣἎᴲὢംᤒ ἲⵆ↮ᴸંѱὢᐂེ↯ⵆ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: ……
2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3: ¦¦¦¦¦¦¦¦package="com.example.android.apis"¦
4: ¦¦¦¦android:versionCode="1"¦
5: ¦¦¦¦android:versionName="1.0"¦
6: ¦¦¦¦android:sharedUserId="android.uid.developer1">
Manifest.xml ⫺Ὢmanifest ⣊צᶾandroid:sharedUserId ἲ ᤒ ⵆӎ ὶᶢ ЇἮ sharedUserId ⣊צЀӪἿẗⳲ၊צྖᤊታἲϮ↲ᅦἿẗⳲ၊צྖὢὢⳲ၊צྖኖ ὢ⤞ᶾתⵎᨆὶ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: ……
2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3: ¦¦¦¦¦¦¦¦package="com.example.android.apis"¦
4: ¦¦¦¦android:versionCode="1"¦
5: ¦¦¦¦android:versionName="1.0">
6: <!-- android:sharedUserId="android.uid.developer1" ᢛ ⵊ. -->¦G
Manifest.xml ⫺Ὢmanifest ⣊צᶾandroid:sharedUserId ἲᤒ ⵆ↮ᴸᴲᵪ, ᴲὢം ӣἎ၊ὦⵊὢ⤞Ἆ▊ὢࢆᕮ`ῶⵊתỲⷆἲᐗ↮ⵎᨆὶ.
ཪ
.
␦ӎጦⶺ
[1] http://developer.android.com/index.html
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: public class UA367 extends Activity {
2: @override
3: ¦¦¦public void onCreate(Bundle savedInstanceState) {
4: ¦¦¦¦¦¦¦¦super.onCreate(savedInstanceState);
5: ¦G ¦¦¦¦¦¦¦¦¦¦¦¦FileAccessThread fileAccessThread = new FileAccessThread();
6: ¦¦¦¦¦¦¦¦¦¦¦¦¦¦FileDeleteThread fileDeleteThread = new FileDeleteThread();
7: ¦¦¦¦¦¦¦¦¦¦¦¦¦¦fileAccessThread.start();
8: ¦¦¦¦¦¦¦¦¦¦¦¦¦¦fileDeleteThread.start();
9: ¦¦¦¦}
10: }
11: ¦¦
12: class FileAccessThread extends Thread {
13: public void run() {
14: try {
15: File f = new File("Test_367.txt");
16: if (f.exists()) { // ᆺᵫ⫺Ὢὢᾚⵆቢ⫺ὪࢢẗἲὫἺ
17: BufferedReader br = new BufferedReader(new FileReader(f));
18: br.close();
19: }
20: } catch(FileNotFoundException e) {
21: System.out.println("Exception Occurred") ; //᷶Ṧ⒆ᆚ
4
ῶ ᫊ϲᏽ⣊
᫊ϲӪ ⣊ᶾ ૮ⵊ ◖ᵫ῾ὢ Ⳳ၊צྖ ே Ӫ ᶾᤊ ᫊ϲ` Њाἲ ⯚ⵖⵊ Њा (Ⳳ၊ᤦ᪒⸧Ἦ᪒ೊ)ὢࢆ᫊᪒⥊⣊ᶾ૮ⵊ ᓢ(Ếᾎὢࢆᤦ᥆ ᓢ)ᶾӮဖఊ ◖ᵫ῾ἲ ᆾⵊ. ὢ࿚ⵊ ◖ᵫ῾ᶾ ⵆં ѱ၊ં ೊཫ(dead lock)ὢࢆ, Ếᶾ ૮ⵊ ҫᾯ⁞Ѣ, ંᤦ᥆ӎ␗ἲᨆὶ.
1.
ҫᾯ⁞Ѣ
:
Ѯᢚ᫊῾Ӫᢚẗ᫊῾
(Time-of-check Time-of-use (TOCTOU) Race Condition)
Ϯ
.
ᒿယ⹆ҫἿẗⳲ၊צྖᶾᤊંẾἲᢚẗⵆ؞ῲᶾẾ⣊ᅪѮᢚⵊ. צ ࿚ࢆẾἲᢚẗⵆં᫊῾ᶾẾ⣊ϮᒮⵆંҫẞϮὶ. ὢѱἪ၊ὦⵢⳲ၊צྖ ᶾᷚ࿚Ϯ↮ጦ , ⅷԾ␗⣊, ҫᾯ⁞Ѣᏽ؞⢮ே؞⹂Ḓᅆὢᐊᣋⵎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ӣἎẾ(᷶: ⫺Ὢ)ἲᷚ࿚᪒ೊϮתⵆᷚᢚẗⵎҫẞ, ே؞⹂՚ጦἲὢẗⵆᷚⵊ ᑶᶾⵆࢆ᪒ೊᆺתϮઓⵆல။Ⳳ၊צྖἲⵆᷚᵪⵊ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: public class SA367 extends Activity¦G{
2: ¦¦¦¦public void onCreate(Bundle savedInstanceState) {
3: ¦¦¦¦super.onCreate(savedInstanceState);
4: ¦¦¦¦¦¦
5: ¦¦¦¦FileAccessThread fileAccess = new FileAccessThread();
6: ¦¦¦¦Thread first = new Thread(fileAccess);
7: ¦¦¦¦Thread second = new Thread(fileAccess);
8: ¦¦¦¦Thread third = new Thread(fileAccess);
9: ¦¦¦¦Thread fourth = new Thread(fileAccess);
10: ¦¦¦¦first.start();
11: ¦¦¦¦second.start();
12: ¦¦¦¦third.start();
13: ¦¦¦¦fourth.start();
14: ¦¦¦¦}
15: }
16: ¦¦
17: class FileAccessThread implements Runnable {¦¦¦¦G
18: ¦¦¦¦public synchronized void run() {¦¦¦¦¦¦¦¦G
22: } catch(IOException e) {
23: System.out.println("Exception Occurred") ; //᷶Ṧ⒆ᆚ
24: }
25: }
26:
27: class FileDeleteThread extends Thread {
28: public void run() {
29: try {
30: File f = new File("Test_367.txt");
31: if (f.exists()) { // ᆺᵫ⫺Ὢὢᾚⵆቢ⫺Ὢἲᢛ ⵖ
32: f.delete();
33: }
34: } catch(FileNotFoundException e) {
35: System.out.println("Exception Occurred") ; //᷶Ṧ⒆ᆚ
36: } catch(IOException e) {
37: System.out.println("Exception Occurred") ; //᷶Ṧ⒆ᆚ
38: }
39: }
40: }
19: ¦¦¦¦G Gtry {¦¦¦¦¦¦¦¦¦¦¦G
20: ¦¦¦¦¦¦¦¦File f = new File("Test.txt");¦¦¦¦¦¦¦¦¦¦G
21: ¦¦¦¦¦¦¦¦if (f.exists()) { // ᆺᵫ⫺Ὢὢᾚⵆቢ⫺ὪࢢẗἲὫἺ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦G
22: ¦¦¦¦¦¦¦¦G G GThread.sleep(100);¦¦¦¦¦G// ᫊ϲὢẂఆંᶳἲϮ ⵖ¦¦¦¦¦¦¦¦¦G
23: ¦¦¦¦¦¦¦¦G G GBufferedReader br = new BufferedReader(new FileReader(f));
24: ¦¦¦¦¦¦¦¦System.out.println(br.readLine());¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦G
25: ¦¦¦G G G ¦¦¦¦¦br.close();¦¦¦¦¦¦¦¦¦¦¦¦G// ⫺ὪࢢẗἲኖాὫἮ⺲ᢛ
26: ¦¦¦¦¦¦G G G ¦¦f.delete();¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦G
27: ¦¦¦¦¦¦G ¦}
28: ¦¦¦¦G G} catch (IOException e) {¦¦¦// ᷶Ṧ⒆ᆚ
29: ¦¦¦¦¦¦¦¦¦¦¦¦System.err.println("IOException occured");
30: ¦¦¦¦G G}¦G
31: ¦¦¦¦}¦G
32: }¦¦
ӣἎẾ(᷶ᅪᶢ, ⫺Ὢ)ἲᷚ࿚᪒ೊϮתⵆᷚᢚẗⵎҫẞ, ே؞⹂՚ጦἲὢẗⵆ ᷚⵊᑶᶾⵆࢆ᪒ೊᆺתϮઓⵆல။ᒮҫⵊ.
ཪ
.
␦ӎጦⶺ
2.
૮၊ ᶢఆ↮ᴸἮᾚ֮
(Uncontrolled Recursion)
Ϯ
.
ᾚ֮ᨊ⹆⺍ᨆᅪ ᶢⵆ↮ኩⵆᷚⵎ૧ఊቂኖᆚࢆⳲ၊צྖ᪒⣋ẾἲӪⵆѺ ᢚẗⵆቢỲⷆⵆ. ૮ᕮᕲҫẞ, ֮⁞Ѣ(base case)ὢᶴંᾚ֮ંጢⵊᾚ֮ᶾᙎ↲.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ጢⵊᾚ֮ᅪᐗ↮ⵆ؞Ỳⵆᷚኖᾚ֮⸦▊ἲ⁞Ѣጦᘂὢࢆᐆᓣጦᘂᴶᶾᤊᆺ ᨆⵢᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: ……
2: public int factorial(int n) {
3: // ᾚ֮⸦▊ὢ⁞Ѣጦ/ᐆᓣጦᘂṦᕮᶾᤊὪᶢࢆቢ૮ᕮᕲጢⵊᾚ֮ᅪἎᐊⵊ.
4: return n * factorial(n - 1);
5: }
ᾚ֮`Ἢ၊ ఆં ⵖᨆ ҫẞ, ᾚ֮ ⸦▊ὢ ⁞Ѣጦ/ᐆᓣጦ ᘂ Ṧᕮᶾᤊ Ὢᶢࢆቢ ૮ᕮᕲጢⵊᾚ֮ᅪἎᐊⵊ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: ……
2: public int factorial(int n) {
3: int i;
4: // ኖᾚ֮⸦▊Ἦ⁞Ѣጦὢࢆᐆᓣጦᘂᴶᶾᤊὢზᶢ…ᵪⵊ.
5: if (n == 1) {
6: i = 1;
7: } else {
8: i = n * factorial(n - 1);
9: }
10: return i;
11: }
ኖ ᾚ֮ ⸦▊Ἦ ⁞Ѣጦὢࢆ ᐆᓣጦ ᘂ ᴶᶾᤊ ᨆⵆӎ `ῶⵊ ֮⁞Ѣ ᤒ Ӫ ὦᨆᨆဢᷚᕮᅪ⹃ὦⵢᵪⵊ.
ཪ
.
␦ӎጦⶺ
5
ῶ ᶾ࿚⒆ᆚ
`ὦᶾ࿚ંᢚῲᶾ ఊ᷶Ṧᢚⵛὢ⪧ ⁞Ѣᶾᤊᐊᣋⵆંᶾ࿚ὢ, ᘲ `ὦᶾ࿚ં ᢚῲᶾ ఆ↮ᴸἮ⹗ᶾᤊᐊᣋⵆંᶾ࿚ὢ. Њᐊં `ὢўࢆᘲ `ὦᶾ࿚ᐊᣋᶾ ૮ᘲⵊᴶῲⵊᶾ࿚⒆ᆚზ⫢ἲᢚῲᶾ ⵆӎ՚ⷲⵖἪ၊᭖ᶾ࿚⒆ᆚӪ ᶾᐊᣋⵎᨆὶં ᓢᴶỲⷿἲᢚῲᶾᐗ↮ⵎᨆὶ. ᶾ࿚ᅪ▗ᕲⵆѺ(ંῲⷮ) ⒆ᆚⵆ↮ᴸἲഺ⸧Ἦᶾ࿚ቂ᫊↮ᶾ ӪலⵆѺᆼἮ ᓢᅪ⯚ⵖⵆᷚὢᅪӣҗϮᴳẗⵎᨆὶἲഺᓢᵫ◖ᵫ῾ὢᐊᣋⵎᨆὶ.
1.
Ḓᅆቂ᫊↮⦣ⵊ ᓢ०▊
(Information exposure through an error message)
Ϯ
.
SWḒᅆቂ᫊↮ᅪ⦣ⵢ⹆ҫ, ᢚẗ, Ӯဖὢ⤞Ⳳ၊צྖࢢᕮ ᓢϮἎ▊ఎᨆὶ. ᷶၊, ᷶Ṧᐊᣋ᫊᷶Ṧὢᅲὢࢆ᪒⣋⪦ὢ᪒ᅪ▊ဓⵆቢⳲ၊צྖࢢᕮ՚⁞ᅪᩫѺ⫺ᴳⵎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ╊ᢚẗᶾѺᐞ⯚ఆંSWᶾᤊંࢢᕮ՚⁞ࢆӣҗᶾ⹊ẗఎᨆὶંᏪϾⵊ ᓢ ᅪḒᅆቂ᫊↮၊▊ဓⵆ↮ᆾᴲᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: ……
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4: try{ throw new IOException(); }
5: catch (IOException e) { e.printStackTrace(); }
6: }
᷶Ṧὢᅲὢࢆ᪒⣋⪦ὢ᪒ᅪ▊ဓⵆቢⳲ၊צྖࢢᕮ ᓢϮἎ▊ఊ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: ……
2: public void onCreate(Bundle savedInstanceState) {
3: super.onCreate(savedInstanceState);
4: try{
5: throw new IOException();
6: }
7: catch (IOException e) { System.out.println("᷶Ṧᐊᣋ"); }
8: }
᷶Ṧὢᅲὢࢆ᪒⣋⪦ὢ᪒ᅪ▊ဓⵆ↮ᴸં.
ཪ
.
␦ӎጦⶺ
2.
Ḓᅆ⹗ᶾ૮ⵊ⒆ᆚᕮᾚ
(Detection of Error Condition Without Action)
Ϯ
.
Ḓᅆં⯚␗ἪࢆצḒᅆᶾ૮ⵢᤊᴲጢ⁞♆லⵆ↮ᴸἪቢ, צ⣊ᶾᤊҲⳲ၊צ ྖὢఆᎮ၊ЊᐊϮலⵆ↮ᴸἮҞӪᅪ⓶྆ⵊ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ᷶ṦંḒᅆᅪ⯚␗(catch)ⵊҫẞצѱᶾ૮ⵊ`ῶⵊ⒆ᆚᅪⵢᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: ……
2: private Connection conn;
3:
4: public Connection DBConnect(String url, String id, String password) {
5: try {
6: String CONNECT_STRING = url + ":" + id + ":" + password;
7: InitialContext ctx = new InitialContext();
8: DataSource datasource = (DataSource) ctx.lookup(CONNECT_STRING);
9: conn = datasource.getConnection();
10: } catch (SQLException e) {
11: // catch ᘂ။ὢᘲᶢὶἺ
12: } catch (NamingException e) {
13: // catch ᘂ။ὢᘲᶢὶἺ
14: }
15: return conn;
16: }
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: ……
2: private Connection conn;
3:
4: public Connection DBConnect(String url, String id, String password) {
5: try {
6: String CONNECT_STRING = url + ":" + id + ":" + password;
7: InitialContext ctx = new InitialContext();
8: DataSource datasource = (DataSource) ctx.lookup(CONNECT_STRING);
9: conn = datasource.getConnection();
10: } catch (SQLException e) {
11: // Exception catchὢ⺲Exceptionᶾ૮ⵊ`ῶⵊ⒆ᆚᅪⵢᵪⵊ.
12: if ( conn != null ) {
13: try {
14: conn.close();
15: } catch (SQLException e1) {
16: conn = null;
17: }
18: }
19: } catch (NamingException e) {
20: // Exception catchὢ⺲Exceptionᶾ૮ⵊ`ῶⵊ⒆ᆚᅪⵢᵪⵊ.
21: if ( conn != null ) {
22: try {
23: conn.close();
24: } catch (SQLException e1) {
25: conn = null;
26: }
27: }
28: }
29: return conn;
30: }
᷶Ṧᅪ⯚␗(catch)ⵊ⺲, ϯϯ᷶Ṧᢚⵛ(Exception)ᶾ૮ⵆᷚ`ῶⵆѺ⒆ᆚⵢᵪⵊ.
ཪ
.
␦ӎጦⶺ
6
ῶ ❂ೊⱶ↶
ḲႺఊⳲ၊צྖἮ؞ઓ, ᫎ႞, ᢚẗ, Ἆ↮ᓢᨆ, ⺖, ὢ᫋ἲ▗ ⵆ؞ Ỳⵆᷚ Ὢ ᨆ⃮ᶾ ❂ೊⱶ↶ἲ Ἆ↮ⵆᷚᵪ ⵊ. Ⳳ၊צྖ ❂ೊϮ ࣶጢ ᓣᾏⵆቢ Ӯᆚ, Ἆ↮ᓢᨆ, Ϯளὢ ඖᶢ↶ ើ ᴲશཪ ᅦ ᫊᪒⥊ᶾ ὢ᫋ⵆ؞ல ⾆, Ⳳ၊צྖᶾં ᴶῲἲỲⷿⵎ◖ᵫ῾ὢ❂ೊᴶᶾᨖҖ…ὶἲϮઓὢὶ.
1.
ࣾ⯚ὦ⤞ᷛ␦⁞
(NULL Pointer Dereference)
Ϯ
.
ࣾ⯚ὦ⤞ᷛ␦⁞ં'Ὢᐆ`Ἢ၊צЋ⒢ϮNULLὢఎᨆᶴ'ཪӎⵆંϮ ἲỲᐆ ἲഺᐊᣋⵊ. ӣҗϮல`Ἢ၊NULL ⯚ὦ⤞ᷛ␦⁞ᅪⵆંҫẞ, צҞӪᐊ ᣋⵆં᷶Ṧᢚⵛἲὢẗⵆᷚ▂⺲ӣҗἲҲⵆંᢚẗఎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ⭪᪒(reference)ᶾ૮ⵊnullЀᷚᕮᅪѮᢚⵆᷚᴶῲⵊҫẞᶾᆺᢚẗⵢᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: ……
2: public void f(boolean b) {
3: String cmd = System.getProperty("cmd");
4: // cmdϮnullὦ↮⒢⡚ⵆ↮ᴸᵆ.
5: cmd = cmd.trim();
6: System.out.println(cmd);
7: ……
Ỳ᷶ ં"cmd" ὢⵛ ఆᶢὶӎϮ ⵆӎὶ↮ᆺ, ӣҗϮ"cmd" ἲ ⁞ⵆቢ, cmdંnullὢఆӎtrim() ቂೊ⸦▊᫊ࣾ⯚ὦ⤞᷶ṦϮᐊᣋⵆѺఊ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: ……
2: public void f(boolean b) {
3: String cmd = System.getProperty("cmd");
4: // cmdϮnullὦ↮⒢⡚ⵆᷚᵪⵊ.
5: if (cmd != null) { md = cmd.trim();
6: System.out.println(cmd);
7: } else System.out.println("null command");
8: ……
ሪ΅cmdϮࣾὦ↮Ѯᢚⵊ⺲ᶾᢚẗⵊ.
ཪ
.
␦ӎጦⶺ
7
ῶ ⚏⹂
Ⳳ⪦ỖᶢϮ Ẃⵊ ὢ⤞ࢆ ؞ઓἲ ᕶ▗ᕲⵆѺ ⚏⹂ ⵆં ҫẞ, ὦϮఊ ὢ⤞Ḯ ὦϮఆ↮ᴸἮὢ⤞ᅪ՚ᕲⵆ↮ኩⵆѺఆᶢⶶẗఆ↮ᴸંᢚẗϲὢ⤞৲▊ὢ Ϯઓⵢ↲. ⚏⹂ંᨊ⽶ὪᐆⳲ⪦ỖᶢЊᐊᐗᒃᤦⵊ՚ⷲࢢẗἲϾ▂ંὪ ើᴲશཪⳲ⪦Ỗᶢᓢᴶ☏ቢୂँἮᏦ၊ᢚẗఊ.
1.
ӣẗቂೊ၊ᕮ⤞ᆚ⤢ఊ
private
ᐞᷢ
-
Ἆ⸃ⴲೊ
(Private Array-Typed Field Returned From A Public Method)
Ϯ
.
private၊ᤎᶦఊᐞᷢἲpublicἪ၊ᤎᶦఊቂೊᅪ⦣ⵢᐆ⹆(return)ⵆቢ, צᐞᷢ ⭪᪒ϮṦᕮᶾӣЊఆᶢṦᕮᶾᤊᐞᷢᨆ ⵎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ private၊ᤎᶦఊᐞᷢἲpublicἪ၊ᤎᶦఊቂೊᅪ⦣ⵢᐆ⹆ⵆ↮ᴸல။ⵢᵪⵊ. ⴲẂⵊҫẞᐞᷢᓣ ᓦἲᐆ⹆ⵆўࢆ, ᒲலpublic ቂೊᅪᤎᶦⵆᷚᢚẗⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: // private ὦᐞᷢἲpublicὦቂೊϮreturnⵊ
2: private String[] colors;
3: public String[] getColors() { return colors; }
ቒᑲᒮᨆcolorsંprivate၊ᤎᶦఆᶶ↮ᆺpublicἪ၊ᤎᶦఊgetColors() ቂೊᅪ⦣ⵢ referenceᅪᶩἲᨆὶ. ὢᅪ⦣ⵢலⵆ↮ᴸἮᨆ ὢᐊᣋⵎᨆὶ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA 1: private String[] colors;
2: // ቂೊᅪprivateἪ၊ⵆўࢆ, ᓣ ᓦᐆ⹆, ᨆ ⵆંpublic ቂೊᅪᒲல၊ᆺ.
3: public void onCreate(Bundle savedInstanceState) {
4: super.onCreate(savedInstanceState);
5: String[] newColors = getColors();
6: }
7: public String[] getColors() {
8: String[] ret = null;
9: if ( this.colors != null ) {
10: ret = new String[colors.length];
11: for (int i = 0; i < colors.length; i++) { ret[i] = this.colors[i]; }
12: }
13: return ret;
private ᐞᷢᓣ ᓦἲᆺᶢᤊ, צѱἲᐆ⹆ⵆல။ⵆቢprivate ᤎᶦఊᐞᷢᶾ૮ ⵊலⵆ↮ᴸἮᨆ ἲᐗ↮ⵎᨆὶ.
ཪ
.
␦ӎጦⶺ
2. private
ᐞᷢ
-
Ἆ⸃ⴲೊᶾӣẗὢ⤞ⵎ૧
(Public Data Assigned to Private Array-Typed Field)
Ϯ
.
publicἪ၊ᤎᶦఊὢ⤞ંቂೊὦϮprivate ᤎᶦఊᐞᷢᶾ΅ᾓఆቢ, private ᐞᷢἲṦᕮᶾᤊתⵎᨆὶ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ publicἪ၊ᤎᶦఊὢ⤞Ϯprivate ᤎᶦఊᐞᷢᶾ΅ᾓఆ↮ᴸல။ⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA 1: ……
2: // userRoles ⴲೊંprivateὢ↮ᆺ, publicὦsetUserRoles()ᅪ⦣ⵢṦᕮᐞᷢὢⵎ૧ఆቢ,
ᢚpublic ⴲೊϮఊ.
3: private String[] userRoles;
4:
5: public void setUserRoles(String[] userRoles) {
6: this.userRoles = userRoles;
7: }
8: ……
userRoles ⴲೊંprivateὢ↮ᆺ, publicὦsetUserRoles()ᅪ⦣ⵢṦᕮᐞᷢὢⵎ૧ఆቢ, ᢚpublic ⴲೊϮఊ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: ……
2: // Ћ⒢Ϯ⡢྆᪒private memberᅪᨆ ⵆ↮ᴸல။ⵊ.
3: private String[] userRoles;
4:
5: public void setUserRoles(String[] userRoles) {
6: this.userRoles = new String[userRoles.length];
7: for (int i = 0; i < userRoles.length; ++i)
8: this.userRoles[i] = userRoles[i];
9: }
10: ……
έဓఊᐞᷢreferenceϮᴲ, ᐞᷢ"Ѐ"ἲprivate ᐞᷢⵎ૧ⵖἪ၊᭖private ቒᑲ ၊ᤊתպⵊἲἎ↮᫊✊⃮.
ཪ
.
␦ӎጦⶺ
3.
᫊᪒⥊ὢ⤞ ᓢ৲▊
(Information Leak of System Data)
Ϯ
.
᫊᪒⥊ࢢᕮὢ⤞ࢆംᑲسӮဖ ᓢϮӣЊఆቢ, ὢᅪ⦣ⵢӣҗᶾѺᴲὢംᶢᅪ ӣⵆંӣҗᘺᏦϮఊ.
ࢆ
.
ᴶῲⵊ❂ഗ؞ᒃ
▪ ംᑲسἲỲⵢⵊ᫊᪒⥊ ᓢ▊ဓ❂ೊᅪኖాᢛ ⵢᵪⵊ.
.
᷶
■ ᴶῲⵆ↮ᴸἮ❂ೊ᷶- Android-JAVA
1: ……
2: public void f() {
3: try { g(); }
4: catch (IOException e) {
5: // ᷶Ṧᐊᣋ᫊printf(e.getMessage())ᅪ⦣ⵢḒᅆቂ᫊↮ ᓢϮἎ▊ఊ.
6: System.err.printf(e.getMessage());
7: }
8: }
9: private void g() throws IOException { …… }
10: ……
᷶Ṧᐊᣋ᫊getMessage()ᅪ⦣ⵢḒᅆḮӮဖఊ᫊᪒⥊ᶾ࿚ ᓢᏪϾⵊ ᓢϮἎ▊ ఎᨆὶ.
■ ᴶῲⵊ❂ೊ᷶- Android-JAVA
1: ……
2: public void f() {
3: try { g(); }
4: catch (IOException e) {
5: // end userϮᓪᨆὶંḒᅆቂ᫊↮ ᓢᅪᣋⵆ↮ᴸᴲᵪⵊ.
6: System.err.println("IOException Occured");
7: }
8: }
9: private void g() throws IOException { …… }
10: ……
Ϯ`ὢቢӣҗᘺᏦϮఎᨆὶંḒᅆḮӮဖఊᤦⵊ ᓢં╊ᢚẗᶾѺ० ▊ⵆ↮ᴸં.
ཪ
.
␦ӎጦⶺ
2
ᾓ ẗᶢ ᆚᏽᵫᶢⱊ
1
ῶ ẗᶢ ᆚ
▪ Advanced Encryption Standard (AES) : Ꮶ՛ ᕮⱊ⃮Ἢ၊↮ ఊᘂ။ᵂ⸦⸃᫋Ἢ၊ ὢῲ DESᅪ૮⒢ⵆ, Ꮶ՛ⱊ⃮؞ᨎᷞ՚(NIST)Ϯ5लⱊ⃮⹂Ӫ ἲўⒾ2001 ल11Ểᶾᷞᐗ ᓢ⒆ᆚⱊ⃮(FIPS 197)Ἢ၊ᐊⱊⵆᷮ.
▪ DES ᴺӎᆚↆ : DES(Data Encryption Standard)ᵂ⸦ંᵂ⸦⹂⢒Ḯᓣ⸦⹂⢒ϮЇἮ ૮♛⢒ ᵂ⸦၊ὢᵂ⸦ં૮♛ᘂ။ᵂ⸦၊ᤊ⮷ጦϯᘂ။ئὢϮ64ᘲ⪦ὢӎ, ⢒ Ϯ64ᘲ⪦ὢ, ᵂ⸦ጦὢ64ᘲ⪦ὦᵂ⸦ὢ. ῲᨆӣҗ(Brute Force)ӣҗᶾⵢᤊⵢளఆ ᶶ.
▪ Manifest ⫺Ὢ : ᴶೊ၊ὢೊẗᶢ⳺ᆚ⛮ὢ᥆պⵊ, ᆚ᪒ᢚẗἲ ⵊXML ጦᤊ
2
ⶾⶾ
2
ῶ ᵫᶢⱊ
▪ ACL : Access Control List
▪ AES : Advanced Encryption Standard ▪ CSRF : Cross-Site Request Forgery ▪ CWE : Common Weakness Enumeration ▪ DES : Data Encryption Standard ▪ ESAPI : Enterprise Security API ▪ HTML : Hyper Text Markup Language
▪ HTTPS : Hypertext Transfer Protocol over Secure Socket Layer ▪ JAAS : Java Authentication and Authorization Service
▪ JDBC : Java Database Connectivity
▪ LDAP : Lightweight Directory Access Protocol ▪ MSB : Most Significant Bit
▪ OAEP : Optimal Asymmetric Encryption Padding ▪ OWASP : Open Web Application Security Project ▪ RSA : Ron Rivest, Adi Shamir, Leonard Adleman ▪ SHA : Secure Hash Algorithm
순번
제
․
개정일
변경 내용
비고
1
2
0
1
1
.6
.2
1
[
제정
]
SW
개발보안 가이드
V1
.
0
2
2
0
1
1
.8
.2
5
[
개정
]
o‘
붙임
3
.Andr
oi
d-
J
AVA
시큐어코딩 가이드
’
․
(
p.
2
)‘
상대디렉터리 경로 조작
’
에 대한
‘
안전한
소스코드 예제
’
수정
․
(
p.
1
5
)'
외부에서 접근하여 활성화 가능한 컴포넌
트
'
의
‘
가
.
정의
’
수정
V1
.
1
Andr
oi
d-
J
AVA
시큐어 코딩 가이드
201
1
년
6
월 초판 인쇄
201
1
년
6
월 초판 발행
201
1
년
9
월
2
판 인쇄
201
1
년
9
월
2
판 발행
발행처
행정안전부
(
ht
t
p:
//www.
mopa
s
.
go.
kr
)
인쇄처
한올
(
Te
l
:02-
227
9-
8494
)
<
비매품
>
□
본 보고서의 내용과 관련한 문의는 아래로 해 주시기 바랍니다
.
※
행정안전부
홈페이지
www.
mopas
.
go.
kr
대표전화
02
)2100
-
3633,29
27
※
한국인터넷진흥원