Android IME / InputMethodService ์ ์ฉ (์ ์ฑ ํค๋ณด๋)
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ฐ์
Android๋ InputMethodService(IME)๋ฅผ ํตํด ํ์ฌ ํค๋ณด๋๋ฅผ ํ์ฉํ๋ค. ์ฌ์ฉ์๊ฐ ํค๋ณด๋๋ฅผ ์ฌ์ฉ ์ค์ ํ๊ณ ์ด๋ฅผ ํ์ฌ ์
๋ ฅ ๋ฐฉ๋ฒ์ผ๋ก ์ ํํ๋ฉด, IME๋ ์ฑ ์ ๋ฐ์์ ์์ฑ๋๋ ๊ฑฐ์ ๋ชจ๋ ํ
์คํธ ์
๋ ฅ์ ๊ด์ฐฐ(๋ฐ ์กฐ์)ํ ์ ์๋ค.
์ด ๋๋ฌธ์ ์ผ๋ถ Android ๋ฑ
ํน ํธ๋ก์ด๋ชฉ๋ง๋ โsecure keyboardโ ๊ธฐ๋ฅ์ ๋ฒ๋ค๋ก ํฌํจํ๋ค: ์
์ฑ IME๋ WebView๋ฅผ ์ ํ ํฌํจํ์ง ์๋ ์ฑ(๋ฑ
ํน ์ฑ, ์ฑํ
์ฑ, ์ํธํํ ์ง๊ฐ ๋ฑ)์์๋ ํค ์
๋ ฅ์ ์์ ํ๋ค.
Note
android.permission.BIND_INPUT_METHOD์ ์ผ๋ฐ์ ์ผ๋ก IME service์ ์ ์ธ๋์ด ์์คํ ๋ง ๋ฐ์ธ๋ฉํ ์ ์๋ค. ๋จ์ํ ์ ์ธํ๋ค๊ณ ํด์ ํน๋ณ ๊ถํ์ด ๋ถ์ฌ๋๋ ๊ฒ์ ์๋๋ฉฐ; ํต์ฌ ๋จ๊ณ๋ ํผํด์๊ฐ ์ค์ ์์ ํค๋ณด๋๋ฅผ ์ฌ์ฉ ์ค์ /์ ํํ๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค.
Manifest ์ ์ธ
ํค๋ณด๋๋ android.view.InputMethod intent action์ ๊ฐ์ง ์๋น์ค์ IME ๊ตฌ์ฑ XML์ ํตํด ๋
ธ์ถ๋๋ค:
<!-- AndroidManifest.xml -->
<service
android:name=".SpyKeyboard"
android:permission="android.permission.BIND_INPUT_METHOD"
android:exported="false">
<intent-filter>
<action android:name="android.view.InputMethod" />
</intent-filter>
<meta-data
android:name="android.view.im"
android:resource="@xml/spy_ime" />
</service>
ํ์ง ํ: InputMethodService๋ฅผ ์ ์ธํ๋ ํค๋ณด๋์ฒ๋ผ ๋ณด์ด์ง ์๋ ์ฑ์ ๊ฐ๋ ฅํ ๊ฒฝ๊ณ ์ ํธ์
๋๋ค.
๋ฐ์ดํฐ ์ถ์ฒ
์คํ ์ค IME๋ ๋ค์ ์ ๋ณด๋ฅผ ์๊ฒ ๋ฉ๋๋ค:
- ์
๋ ฅ ์ค์ธ ๋์ ์ฑ (
EditorInfo๋ฅผ ํตํด, ์:onStartInput์attribute.packageName). - ์
๋ ฅ๋๋ ํ
์คํธ (ํ์ฌ
InputConnection๊ณผ์ ์ํธ์์ฉ ๋ฐ/๋๋ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ key events๋ฅผ ํตํด).
Minimal (non-functional) sketch of the high-signal hook point:
public class SpyKeyboard extends InputMethodService {
@Override public void onStartInput(EditorInfo attribute, boolean restarting) {
// attribute.packageName identifies the foreground app receiving input
}
}
Common enablement & collection workflow (observed in the wild)
- APK๋ โsecure keyboardโ๋ก ๋ง์ผํ ๋๊ฑฐ๋ ํค๋ณด๋๊ฐ ๋ ํฐ trojan ์์ ํฌํจ๋์ด ์๋ค.
- ์
์ฑ์ฝ๋๋ ํผํด์๋ฅผ ์์คํ
ํค๋ณด๋ ์ค์ (์:
Settings.ACTION_INPUT_METHOD_SETTINGS๋ฅผ ์คํํ๊ฑฐ๋ UI ์๋ํ๋ฅผ ์ฌ์ฉํ์ฌ)์ผ๋ก ์ ๋ํด IME๊ฐ ํ์ฑํ๋๊ณ ๊ธฐ๋ณธ ์ ๋ ฅ๊ธฐ๋ก ์ค์ ๋ ๋๊น์ง ์งํํ๋ค. - ์ฑ๋ณ๋ก ํค ์
๋ ฅ์ ๋ฒํผ๋งํ๊ณ ์
์ฑ์ฝ๋์ ๊ธฐ์กด C2 ์ฑ๋์ ํตํด ์ธ๋ถ๋ก ์ ์ถํ๋ฉฐ, ์ข
์ข
๋ค๋ฅธ ๋ฐ์ดํฐ ์์ค(์:
WebViewman-in-the-browser telemetry)์ ๊ฒฐํฉ๋๋ค.
How to detect / triage
On-device checks
- Settings: ์ค์น๋ ํค๋ณด๋ / ๊ธฐ๋ณธ ํค๋ณด๋ (์ ์ ์๋ IME ํ์ธ).
- ADB:
adb shell dumpsys input_method
adb shell ime list -a
adb shell ime help
APK์ ์ ์ ์ ๋ณ
InputMethodServiceํด๋์ค์android.view.InputMethodintent filter๋ฅผ ์ฐพ์ผ์ธ์.android.view.im์์ ์ฐธ์กฐ๋๋@xml/*IME ๊ตฌ์ฑ์ ๊ฒ์ฌํ์ธ์.- ์ฑ์ ๋ช ์๋ ๊ธฐ๋ฅ์ด ์ ์ฒด ํค๋ณด๋ UI/๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ๊ณผ ์ผ์นํ๋์ง ํ์ธํ์ธ์.
์ํ ์กฐ์น
- User/MDM: ์ ๋ขฐํ ์ ์๋ ํค๋ณด๋๋ฅผ ํ์ฉ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ณ , ๊ด๋ฆฌ๋๋ ํ๋กํ/๋๋ฐ์ด์ค์์ ์๋ ค์ง์ง ์์ IME๋ฅผ ์ฐจ๋จํ์ธ์.
- App-side (high risk apps): ํผ์ฑ ์ ํญ ์ธ์ฆ(ํจ์คํค/์์ฒด์ธ์)์ ์ฐ์ ์ฌ์ฉํ๊ณ , โsecret text entryโ๋ฅผ ๋ณด์ ๊ฒฝ๊ณ๋ก ์์กดํ์ง ๋ง์ธ์(์ ์ฑ IME๋ ์ฑ UI ์๋์ ์์นํฉ๋๋ค).
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


