Virus vs Antidotes code golf
Python 3, 131 bytes

j=''.join
g=lambda s:eval('j(s)'+4*'.replace(&quot;%s%s&quot;,&quot;%s%s&quot;)'%(*'vbbbbvbbavacvaca',))
f=lambda x:j(map(g,zip(*map(g,x)))).count('v')

Try it online!
-2 bytes thanks to Kevin Cruijssen
Explanation
Replaces all 'v' to 'b' if found next to 'b'. Next, replaces all 'v' to 'c' if found next to 'a'. A second iteration with the transposed version of the array clears all vertical and diagonal viruses. Finally, it will return the remaining number of 'v's.

Without eval:
Python 3, 134 bytes

j=''.join
g=lambda s,m='vbbbbvbbavacvaca':m and g(j(s).replace(m[:2],m[2:4]),m[4:])or s
f=lambda x:j(map(g,zip(*map(g,x)))).count('v')

Try it online!