2026년 3월 24일 화요일, Linear는 동일 워크스페이스 내 다른 멤버들에게 비공개 팀의 데이터를 노출시키는 코드 변경을 배포했습니다. 약 1시간 동안, 즉 UTC 기준 12:07부터 1:10까지 워크스페이스 멤버(게스트 사용자 포함)가 평소 팀 권한 범위를 벗어난 데이터에 접근할 수 있었습니다.
Linear의 인가 계층은 쿼리별로 권한 필터를 추가하기 위해 'sync group' 리졸버를 사용합니다. 성능 최적화는 사용자와 절대 일치할 수 없는 리졸버를 건너뛰도록 설계되었고, 단일 내부 워크스페이스에서만 실행되도록 제한되어 있었습니다. 그러나 다른 곳에서 최적화를 비활성화하는 코드 경로에 변수 섀도잉 버그가 있었습니다. 원래 필터로 폴백하는 대신 모든 사용자별 리졸버를 제거해버렸고, 그 결과 하위 권한 검사가 완전히 건너뛰어져 쿼리가 필터링되지 않은 결과를 조용히 반환했습니다.
이 변경은 동료 검토와 테스트를 거쳤지만, 최적화가 활성화된 경로만 검증되었습니다. 다른 워크스페이스에서 비활성화된 경로는 아무도 테스트하지 않았습니다. Linear 팀은 이 버그가 AI가 작성한 것이 아니라고 특별히 언급했습니다. 이는 테스트 커버리지 공백을 드러낸 인간의 변수 섀도잉 회귀였습니다.
노출은 알림 다이제스트(한 멤버가 전체 워크스페이스에 대한 다이제스트를 받을 수 있음), 클라이언트 동기화 부트스트랩, 모바일 세션, 광범위한 OAuth/API 쿼리를 통해 발생했습니다. 자격 증명이나 API 키는 유출되지 않았고, 악의적 남용의 증거도 없었습니다. Linear는 1시간 이내에 변경을 되돌리고, 웹 및 데스크톱 클라이언트를 강제로 다시 로드하고, 활성 모바일 세션을 로그아웃시키고, 영향을 받은 워크스페이스 연락처에 48시간 이내에 통지했습니다.
비용은 얼마였나
2026년 3월 24일 약 1시간 동안 비공개 팀 데이터가 동일 워크스페이스의 다른 멤버와 게스트에게 접근 가능했으며, 약 7,000건의 동기화 및 API 호출이 이를 가져왔을 수 있습니다.
왜 발생했나
최적화의 비활성화 경로에 모든 사용자별 리졸버를 누락시키는 변수 섀도잉 버그가 있었습니다.
테스트 커버리지는 최적화가 활성화된 경우를 검증했지만, 비활성화된 경로는 검증하지 않았습니다.
권한 검사가 실패 시 개방(fail open) 방식으로 작동했습니다. 쿼리가 오류를 발생시키는 대신 결과를 반환했습니다.
알림, 동기화, 모바일 및 API 계층 모두가 손상된 권한 계층을 신뢰했습니다.
교훈
필터를 건너뛰는 접근 제어 '최적화'는 비활성화 경로가 테스트되거나, 정상 경로 검토가 조용한 권한 확대를 승인하지 않는 경우에만 안전합니다.
후속 조치
Linear는 배포 환경, 팀 유형, 역할, 게스트 접근 및 인증 방법 전반에 걸쳐 통합 테스트를 확장하고, 다이제스트당 알림 항목 수를 제한하고, 배포 전 보안 검토와 인가 이상 징후 모니터링을 더욱 강화하기로 약속했습니다. 영향을 받은 워크스페이스 소유자에게 통지했고, 요청한 이들에게는 워크스페이스별 노출 요약을 제공했습니다. 사용자들은 이를 막 1억 달러 ARR을 돌파한 회사가 드물게 투명하게 처리한 보안 사고로 기록했습니다.
근거 확인하기
출처
- Post mortem on Linear security incident on March 24th, 2026 Linear · linear.app ·
- User-specific data accessible to the wrong users within the same workspace Linear Status · linearstatus.com ·
- Linear discloses a data exposure incident Devbytes · devbytes.co.in ·