Are you familiar with the selnolig package? It provides automated ligature suppression for German and English documents. The package requires LuaLaTeX, so it may or may not be usable for your project.
One ligation rule -- cf section 3.4 of the user guide of the package, entitled "Ligature suppression rules: German language case", and esp. "Interlude II" on p. 10 -- says that ligatures should be used (i.e., not suppressed) if they occur at the end of abbreviated words. E.g., "Aufl." is written with an fl-ligature even though "Auflage" is not. The word "Auftrag" should not use an ft-ligature (assuming, of course, that the text font that's in use provides an ft-ligature), whereas it's fine to write the abbreviated form, 'Auft.', with a ligature.
According to this rule, then, both Ebff. and ff. should definitely be written with an ff-ligature.
The "affront" case is different. While it's true that the word derives from a combination of two Latin morphemes ('ad' and 'frons'; "ad frontem" -- "to the face"), it's also fair to point out that for the past few centuries most ordinary folks have likely been blissfully unaware of the word's etymology. De facto, then, 'affront' nowadays consists of a single morpheme. (As you probably know, syllable boundaries and morpheme boundaries needn't coincide.) As the ff
-pair doesn't cross a morpheme boundary, there is therefore no need to suppress the ff-ligature. The fact that the syllable boundary crosses the ff-pair is irrelevant, as is the fact that the word "affront" is a "Fremdwort" in German (or, at most, a "Lehnwort").