From 11269687a8e781b93078c90474bdcdad4d264178 Mon Sep 17 00:00:00 2001 From: Jasper Date: Mon, 24 Aug 2026 18:51:42 +0000 Subject: [PATCH] fix(security): fail closed on malformed tool visibility (#11474) --- crates/goose/src/agents/reply_parts.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/crates/goose/src/agents/reply_parts.rs b/crates/goose/src/agents/reply_parts.rs index 1fc0d9494..78938e193 100644 --- a/crates/goose/src/agents/reply_parts.rs +++ b/crates/goose/src/agents/reply_parts.rs @@ -841,7 +841,7 @@ pub fn is_tool_visible_to_model(tool: &Tool) -> bool { return true; }; let Some(arr) = visibility.as_array() else { - return true; + return false; }; arr.iter().any(|v| v.as_str() == Some("model")) } @@ -1847,9 +1847,17 @@ mod tests { } #[test] - fn test_tool_visible_when_visibility_is_not_array() { - let tool = make_tool_with_meta(Some(serde_json::json!({"ui": {"visibility": "model"}}))); - assert!(is_tool_visible_to_model(&tool)); + fn test_tool_hidden_when_visibility_is_not_array() { + for visibility in [ + serde_json::json!("app"), + serde_json::json!("model"), + serde_json::json!({"model": true}), + serde_json::Value::Null, + ] { + let tool = + make_tool_with_meta(Some(serde_json::json!({"ui": {"visibility": visibility}}))); + assert!(!is_tool_visible_to_model(&tool)); + } } #[test]