In order to explain the current GC process there are couple of things to know: an update_operation is created each time an updater runs (i.e. when we deem that things have changed on a remote source), the uo_vuln table holds the relationship between that update_operation and the vuln table.
- When there is a change in a security feed we will pull in all the data and try and insert it again (these inserts can conflict if the vuln information is the same and this is expected), during this update we also assign all the vulns we process (whether they already existed or not) to a newly created update_operation (through the uo_vuln table).
- When the GC runs it basically deletes old update operations (not all "unused" but any older update_operations dictated by update_retention config value), (2 update operations per updater is the lowest value as it's needed for the notifier*).
- The deletion of the update_operation will result in the implicit deletion of the related uo_vuln rows
- Finally the GC will remove any orphaned vulns (vulns without a uo_vuln row)
So in answer to your question, yes the GC will eventually delete vulnerabilities that no longer exist in external sources, this is desired behaviour to prevent the matcher DB continually growing but still providing an accurate picture of what our sources are saying. But note, if the vulnerability does still exist in the remote source it will be continually associate to the newest update_operation and won't be GCd.
* the notifier needs 2 update_operations to be able to provide the delta between two updates, this delta can be used to see which vulns were added and thus trigger notifications.