OpenRemote Manager: RemoveAlarms 교차 영역 IDOR(대량 삭제)
OpenRemote Manager는 교차 테넌트 안전하지 않은 Direct에 취약합니다. 대량 경보 삭제 엔드포인트의 개체 참조(IDOR)입니다. 안 모든 영역의 인증된 사용자는 다른 영역에 속한 알람을 삭제할 수 있습니다. 임의의 경보 ID를 제공하여 영역(테넌트)을 생성합니다. 취약점 대량의 RemoveAlarms() 메소드는 다음 사항만 확인하기 때문에 존재합니다. 호출자 자신의 영역이 활성화되어 있고 액세스 가능하지만 삭제되기 전에 대상 알람 ID는 발신자의 영역에 속합니다. 그들.
이를 통해 자신의 영역에서 알람 쓰기 권한을 가진 모든 사용자를 허용합니다. 안전에 중요한 기록을 포함하여 경보 기록을 영구적으로 파기합니다. 보안 경고 — 동일한 OpenRemote의 다른 테넌트에 속함 설치.
[추가정보] 단일의 RemoveAlarm() 메소드는 다음을 올바르게 검증합니다. 대상 경보 영역이 호출자의 액세스와 일치합니다.
// 정답(단수):
SentAlarm 알람 = AlarmService.getAlarm(alarmId);
if (!isRealmActiveAndAccessible(alarm.getRealm())) {
새로운 ForbiddenException(...)을 던져라;
}
복수형 RemoveAlarms() 메소드에 이 알람별 영역이 없습니다. 호출자 자신의 영역을 확인하고 유효성만 검증합니다. 인증된 사용자에 대해서는 거의 만족하지 않습니다.
// 취약함 (복수형):
공공 무효 제거알람(RequestParams requestParams, List<Long> AlarmIds) {
if (!isRealmActiveAndAccessible(getAuthenticatedRealmName())) {
새로운 ForbiddenException(...)을 던져라; // 모든 인증 사용자에 대해 항상 전달됩니다.
}
List<SentAlarm> 알람 = AlarmService.getAlarms(alarmIds); // 영역 필터 없음
AlarmService.removeAlarms(alarms, AlarmIds); // 영역 필터 없음
}
기본 서비스 쿼리에는 영역 범위 지정이 포함되어 있지 않습니다.
// AlarmService.getAlarms(List<Long>):
":ids의 sa.id가 있는 SentAlarm sa에서 sa를 선택하십시오."
// 영역 필터 없음
// AlarmService.removeAlarms():
":ids의 sa.id가 있는 SentAlarm sa에서 삭제"
// 영역 필터 없음
알람 ID는 순차적 자동 증가 Long 값입니다(JPA @GeneratedValue)를 사용하여 간단하게 열거할 수 있습니다.
[취약점 유형] 안전하지 않은 IDOR(직접 개체 참조)/승인 누락 CWE-639: 사용자 제어 키를 통한 인증 우회 CWE-862: 승인 누락
[제품 판매처] 오픈리모트(openremote.io)
[영향을 받는 제품 코드 베이스] OpenRemote Manager - 2026년 현재 버전 (github.com/openremote/openremote)
[영향을 받는 구성요소] org.openremote.manager.alarm.AlarmResourceImpl#removeAlarms() org.openremote.manager.alarm.AlarmService#getAlarms(목록<긴>) org.openremote.manager.alarm.AlarmService#removeAlarms()
파일: Manager/src/main/java/org/openremote/manager/alarm/AlarmResourceImpl.java 파일: Manager/src/main/java/org/openremote/manager/alarm/AlarmService.java
[공격 유형] 원격(인증됨)
[CVE 영향 기타] 다음을 포함한 경보 기록의 테넌트 간 영구 파기 IoT 환경의 안전 중요 및 보안 경고. 또한 활성화 테넌트 간 경보 열거(경보 ID의 존재 여부 공개) 모든 테넌트에 걸쳐).
[공격 벡터]
PoC:
테넌트 A(공격자) : 영역 = "tenant-a"
사용자 = 공격자@tenant-a.com
역할 = WRITE_ALARMS_ROLE
테넌트 B(피해자) : 영역 = "tenant-b"
ID가 1174,1173, 1180인 알람이 존재합니다.
삭제 /api/smartcity/alarm HTTP/2
콘텐츠 유형: 애플리케이션/json
[1174,1173, 1180] /// <- 알람 ID
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 96.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 96.00 |
VPI 공식 vpi-v1 기준