I think the answer is yes, certain phonological rules are context free, in the sense that they can be described for any context free language. I'll just consider a hypothetical case in which the phoneme n changes to the phoneme m before the phoneme p. The general idea of this answer is to adapt techniques used in GPSG (Generalized Phrase Structure Grammar), in which theory syntactic transformations are avoided by, essentially, applying them to a CFG (Context Free Phrase Structure Grammar) rather than to language expressions that are generated by a CFG.
Here is a very small scale example to illustrate. I use lower case letters standing for phonemes and terminal symbols of a CFG, but to make the examples easier to read, I use ordinary English spelling. Please imagine that the spellings are actually phonemic forms.
Language without phonological rules:
{Dan punps, Elsa spits}
CFG for this language:
S -> NP VP
NP -> Dan, Elsa
VP -> punps, spits
Language with the rule n -> m /__p:
{Dam pumps, Elsa spits}
CFG for this language:
S -> NP-ends-with-m VP-begins-with-p
S -> NP-ends-with-n VP
NP-ends-with-m -> Dam
NP-ends-with-n -> Dan
NP -> Elsa
VP -> spits
VP-begins-with-p -> pumps
VP -> spits
In this example, enough phonemic information is incorporated into syntactic category names (non-terminal symbols of a CFG) to describe which words and phrases have undergone the phonological rule and which words or phrases will trigger the rule.
Now, I'll give a more general account of how to produce a CFG for a context free language in which all the n's have changed to m's before p. Beginning with the language which has not undergone the change, we need to characterize all the words and phrases ending in n, all those that begin with p, which will tell us where the rule is applicable, then make the change everywhere it is applicable.
If a CF rule begins on its righthand side with terminal symbol (i.e., phoneme) p or a non-terminal symbol with the suffix -begins-with-p, then we check that the nonterminal symbol on the left of the CF rule has the suffix -begins-with-p, or add that suffix if it is not already there. (We will need to scan through all the CF rules several times to make sure this change is made everywhere it is applicable, but there are only a finite number of rules to check, since a CFG can have only a finite number of rules).
Similarly, we need to check for CF rules whose rightmost symbol is either n or a non-terminal with the suffix -ends-in-n, the if so, add to the non-terminal on the left side of the rule the suffix -ends in n. As above, this change has to be made everywhere applicable, for each of the finite number of rules.
To make the change, we begin by going through all the rules checking on the right side for any n before immediately following p and change any such n's to m's. Then any rule with a non-terminal with the suffix -ends-with-n, before terminal symbol p or a non-terminal with suffix -begins-with-p has its suffix changed to -ends-with-m.
Finally, any rule that has a non-terminal with suffix -ends-with-m and terminal symbol n at the end of the right side of the rule has that n replaced by m.
I have used a notation above that extends the non-terminal symbols of a CFG by adding suffixes to their names to add phonemic information, because I wanted to make clear that I was not changing a CFG into some other sort of grammar. But this notation conceals the fact that the above is just a GPSG metarule. In the notation of GPSG the book, Generalized Phrase Structure Grammar, I would have instead have described CF rules using features, instead of suffixes. Then, the structural description of the n->m/_p rule would be described with "foot features" which percolate up a syntactic tree and the structural change of the rule with a "head feature" which percolates down a syntactic tree.