NornicDB의 Bolt 서버에는 부적절한 네트워크 바인딩이 있어 무단 원격 액세스가 허용됩니다.
--address CLI 플래그(및 NORNICDB_ADDRESS / server.host 구성 키)는 HTTP 서버를 통해 올바르게 연결되지만 Bolt 서버 구성에 도달하지 않습니다. 따라서 Bolt 리스너는 사용자가 구성한 내용에 관계없이 항상 와일드카드 주소(모든 인터페이스)에 바인딩됩니다.
LAN에서는 기본 admin:password 자격 증명이 포함된 그래프 데이터베이스가 네트워크를 공유하는 모든 장치에 노출됩니다.
-nornicdb v1.0.39
main의 afe7c9d 커밋에서 빌드됨$ nornicdb는 --address 127.0.0.1 --bolt-port 7687 --http-port 7474 ...
출력에서는 Bolt가 로컬 호스트에 있다고 주장합니다.
bolt://localhost:7687을 수신하는 Bolt 서버
그러나 실제 소켓은 다음과 같습니다.
$ netstat -an -p TCP | 그렙 7687
tcp46 0 0 *.7687 *.* 들어보세요
$ lsof -iTCP:7687 -sTCP:LISTEN -n -P
nornicdb ... IPv6 ... TCP *:7687(듣기)
HTTP 포트가 올바르게 바인딩되었습니다.
tcp4 127.0.0.1.7474 *.* 들어보세요
LAN의 다른 호스트에서 연결 가능:
$nc -z 192.168.x.y 7687
192.168.x.y 포트 7687 [tcp/*]에 연결에 성공했습니다!
config.yaml에서 NORNICDB_BOLT_ADDRESS=127.0.0.1 또는 server.host: "127.0.0.1"을 설정하면 Bolt 리스너에 효과가 없습니다.
pkg/bolt/server.go:774-776에서:
``가다 func (s *Server) ListenAndServe() 오류 { addr := fmt.Sprintf(":%d", s.config.Port) 리스너, 오류 := net.Listen("tcp", addr) ... }
`bolt.Config`(라인 474)에는 `Host`/`Address`/`Addr` 필드가 없고 `Port`만 있습니다. CLI 플래그 `--address`는 `cmd/nornicdb/main.go:80`의 로컬 변수에 저장되고 사용자 측 로그 출력 형식을 지정하는 데 사용되지만(라인 637-644) Bolt가 초기화될 때 라인 600-609의 `boltConfig`에 복사되지 않습니다.
`ListenAndServe`는 빈 호스트를 사용하여 `net.Listen("tcp", ":7687")`을 호출하므로 Go는 모든 인터페이스에서 와일드카드 소켓을 바인딩합니다.
## 제안된 수정 사항
1. `bolt.Config`에 `Host string` 필드를 추가합니다(기본값 `"127.0.0.1"`, CLI 플래그 기본값과 일치).
2. `cmd/nornicdb/main.go`에서 601번째 줄 주위에 다음을 통해 연결합니다.
``가다
boltConfig.Host = 주소
boltConfig.Port = boltPort
pkg/bolt/server.go:775에서 호스트를 사용합니다.
``가다
addr := net.JoinHostPort(s.config.Host, strconv.Itoa(s.config.Port))
admin:password 자격 증명 + 와일드카드 바인딩 = 동일한 Wi-Fi에 있는 누구나 기본 설정으로 실행되는 NornicDB 인스턴스에 대해 임의의 Cypher 쿼리(노드 읽기, 쓰기, 삭제)를 실행할 수 있습니다.--address 127.0.0.1(문서화된 기본값)이 두 프로토콜을 로컬 호스트에 바인딩한다고 합리적으로 가정합니다.pf) → 7687. 문서에서 검색할 수 없습니다.왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 98.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 98.00 |
VPI 공식 vpi-v1 기준