C.W.K.
Stream
Lesson 01 of 04 · published

만지면 안 되는 필드

~10 min · secure-field, subrole, capture-time, refuse

Level 0차가운 부싯돌
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"아무 텍스트 필드나 읽을 수 있는 도구는 지워지지 않는 잉크로 선 하나를 그어야 해: 절대 비밀번호는 아니다."

만지면 안 되는 필드

Flint 의 일 전부가 텍스트 필드를 읽고 쓰는 거라, 필드의 한 범주를 근본적으로 출입 금지로 만들어: 보안 필드 — 비밀번호 상자, PIN 입력, 앱이 민감하다고 표시한 뭐든. '맥락' 위해 비밀번호를 읽는 건 재앙일 거고; 보안 컨트롤에 맹목적으로 쓰는 건 거의 그만큼 나빠. 그래서 Flint 은 보안 필드를 그냥 안 가는 데로 다뤄. 이건 무른 선호가 아냐; 앱에서 지워지지 않는 잉크로 그은 하나의 경계야.

캡처에서 감지

강제는 가능한 제일 이른 순간에 살아: 캡처. Flint 이 포커스된 요소를 스냅샷할 때, 요소의 역할과 서브롤도 읽어. macOS 가 보안 텍스트 필드를 보안 서브롤로 표시해서, 캡처 시점의 확인 하나가 Flint 한테 '이건 비밀번호 필드야' 라고 알려줘. 그러면, Flint 이 바로 거기서 멈춰 — 선택을 안 읽고, 어떤 맥락도 안 짓고, 진행 안 해. 캡처에서 잡는 건 보안 필드가 변환 후보가 되지조차 않는다는 뜻이야.

포커스된 요소 캡처
   역할 + 서브롤 읽기
     서브롤 == 보안 텍스트 필드 ?
        예   -> 멈춤. 읽기 없음, 맥락 없음, 삽입 없음. 출입 금지.
        아니오 -> 정상 흐름 계속

불투명 필드는?

Track 3 의 불투명 타깃이 이걸 정직하게 복잡하게 해. 포커스된 요소를 숨기는 Chromium 이나 Electron 앱은 그 요소가 보안인지도 숨겨 — Flint 이 필드 타입을 못 봐. 거기서 룰은 다른 방식으로 보수적이야: 창 레벨 폴백이 목적지의 내용을 절대 안 읽고 기존 키보드 포커스에 붙여넣어. 그래서 필드가 안전하다고 확인 못 하는 데서도, 절대 안 읽어; 룰의 절대적 절반 — 비밀을 절대 안 읽음 — 이 분류가 안 보일 때조차 성립해.

제일 단단한 경계를 흐름의 제일 이른 지점에 강제해. 시스템에서 제일 중요한 '절대' 는 다른 뭐가 일어나기 전에 확인돼야지, 코드 경로가 건너뛸 수 있는 로직 깊은 데가 아냐. Flint 은 보안 필드를 캡처에서 확인해 — 첫 단계 — 그래서 어떤 나중 갈래도 실수로 그걸 읽거나 겨냥 못 해. 결정적 가드가 이를수록, 우회할 방법이 적고, 절대 깨지면 안 되는 경계는 앞에 게이트가 제일 적어야 해.
절대 안 읽음은 절대적; 쓰기 거부는 역할이 알려진 데. 룰의 두 절반은 도달 범위가 달라. '보안 필드를 절대 안 읽음' 은 무조건 성립 — 불투명 타깃 포함, 거기선 Flint 이 목적지 내용을 아예 안 검사. '쓰기 거부' 는 컨트롤이 자기를 보안으로 선언하는 데 적용; 필드 타입을 안 밝히는 불투명 창엔, Flint 의 창 레벨 붙여넣기가 읽지 않고 포커스에 써, 쓰기-분류가 없을 때도 읽기-경계를 온전히 유지해.

Code

보안-필드 확인, 캡처의 순간에·swift
func snapshot() -> TargetSnapshot? {
    guard let element = focusedElement() else { return nil }

    // 역할 + 서브롤을 먼저 읽어 — 어떤 내용을 만지기 전에.
    let subrole = copyAttr(element, kAXSubroleAttribute) as? String
    if subrole == (kAXSecureTextFieldSubrole as String) {
        // 비밀번호 필드. 안 읽고, 안 겨냥. 완전 멈춤.
        return nil
    }

    // 비-보안 필드만 선택 읽기 지점에 도달함.
    let selection = copyAttr(element, kAXSelectedTextAttribute) as? String
    return TargetSnapshot(element: element, selection: selection, /* ... */)
}

External links

Exercise

보안-필드 확인이 왜 삽입 직전이 아니라 캡처에 속하는지, 늦은 확인이 건너뛰어질 수 있는 구체적 흐름을 써서 설명해. 그다음 더 어려운 경우를 다뤄: 포커스된 요소 타입이 접근성에 안 보이는 불투명 Electron 앱 — '비밀을 절대 안 읽음' 의 어느 절반이 여전히 절대적으로 성립하고, Flint 이 필드를 분류 못 하면서 어떻게 그걸 지켜?
Hint
캡처에서 확인이 흐름 전체를 게이트해서, 어떤 나중 갈래(폴백 경로, 이른 반환)도 보안 필드를 읽거나 겨냥 못 해; '삽입 직전' 만의 확인은 맥락을 더 일찍 읽는 어떤 경로로도 우회될 수 있어. 불투명 경우엔, '절대 안 읽음' 절반이 절대적으로 성립: Flint 의 창 레벨 폴백이 목적지 내용을 절대 안 읽고 기존 포커스에 붙여넣어서, 필드를 분류 못 해도 검사도 안 해 — 읽기-경계가 빠진 분류를 넘어 살아남아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.