diff --git a/changes/52810-cap-truncated-text-list-tooltip b/changes/52810-cap-truncated-text-list-tooltip
new file mode 100644
index 00000000000..4b93dbe1ef7
--- /dev/null
+++ b/changes/52810-cap-truncated-text-list-tooltip
@@ -0,0 +1 @@
+- Fixed the software details modal so that hovering the vulnerabilities list shows the first 10 CVEs and a count of the rest, instead of a tooltip that runs off the screen when software has many CVEs.
diff --git a/frontend/components/TruncatedTextList/TruncatedTextList.stories.tsx b/frontend/components/TruncatedTextList/TruncatedTextList.stories.tsx
index 31dc16b0e20..e38ab745a39 100644
--- a/frontend/components/TruncatedTextList/TruncatedTextList.stories.tsx
+++ b/frontend/components/TruncatedTextList/TruncatedTextList.stories.tsx
@@ -37,3 +37,12 @@ export const AllFit: Story = {
args: { items: ["Mac", "Linux"] },
decorators: [withFrame(360)],
};
+
+/** Hover "+N more" — the tooltip lists 10 items and counts the rest, rather
+ * than growing past the height of the window. */
+export const ManyItems: Story = {
+ args: {
+ items: Array.from({ length: 57 }, (_, i) => `CVE-2026-${1000 + i}`),
+ },
+ decorators: [withFrame(360)],
+};
diff --git a/frontend/components/TruncatedTextList/TruncatedTextList.tests.tsx b/frontend/components/TruncatedTextList/TruncatedTextList.tests.tsx
index d1c87510d98..8cf817c1f3a 100644
--- a/frontend/components/TruncatedTextList/TruncatedTextList.tests.tsx
+++ b/frontend/components/TruncatedTextList/TruncatedTextList.tests.tsx
@@ -65,4 +65,19 @@ describe("TruncatedTextList — truncatedFirstContent edge cases", () => {
expect.objectContaining({ tipContent: longName })
);
});
+
+ it("caps the hidden items listed in the tooltip and counts the rest", () => {
+ const items = Array.from({ length: 57 }, (_, i) => `CVE-2026-${i}`);
+ render(